Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб апр 20, 2024 04:00

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: точность таймера в интерпретаторе байт-кода
СообщениеДобавлено: Вс дек 24, 2006 20:39 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Сегодня наконец реализовал в своем интерпретаторе байт-кода подсистему многозадачности. Поскольку движок будет портироваться на десяток платформ, встал вопрос, а какая точность оптимальна для команды приостановки текущей нити/задачи на ms миллисекунд
Код:
( ms -- ) delay
?

пока ограничился двумя платформами DOS16 и WIN32, написал вот такую функцию получения системного таймера:

Код:
// функция возвращает текущий счетчик миллисекунд
// точное значение не важно, так как функция используется для установки момента времени,
// в которое нужно разбудить задачу

#ifdef DOS16
uint inline fvm_clock() { return clock()*(1000L/CLK_TCK); }
#endif

#ifdef WIN32
uint inline fvm_clock() { return clock()*(1000/(uint)CLK_TCK); }
#endif

void delay()
{
   assert(Dp>=1);
   T[currpid].delay=1;          // включаем проверку истечения времени
   T[currpid].wakeat=fvm_clock()+D[--Dp];   // устанавливаем когда нужно разбудить задачу
   sleep();            // усыпляем текущую задачу
}


Как видно, точность хотя бы в 100 мс штатными средствами хост-ОС и библиотек компилятора не обеспечивается, clock() в DOS16 считает с частотой всего 18.2 Гц. Похоже придется трахаться с перепрограммированием таймера, а это не будет работать даже в DOS-боксе под WinXP/2k, не говоря о том что каждая хост-платформа (а портов движка будет с десяток, учитывая все сочетания распространенных железа и ОС) имеет очень большой разброс по точности таймера и часто не дает ее увеличить.

Как там обстоят дела во всяких Simbian, PalmOS 3.5/4.1/5, WinCE и т.п. ? Похоже придется для многозадачности использовать таймер очень низкого разрешения, а набор команд для точного отмеривания времени делать отдельным опциональным набором, зависимым от хост-платформы.

ЗЫ: может кто поделится лучшими вариантами кода fvm_code() для разных платформ

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс дек 24, 2006 20:57 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
forth@km.ru писал(а):
Поскольку движок будет портироваться на десяток платформ, встал вопрос, а какая точность оптимальна для команды приостановки текущей нити/задачи на ms миллисекунд


А разве можно однозначно ответить на этот вопрос при том, что все "десятки платформ" могут иметь разные аппаратные возможности к отсчету времени?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн дек 25, 2006 20:43 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
А еще под DOS можно включить прерывание от RTC
Код:
INT 70H IRQ 8 RT Clock    Interrupts 1024 times per second (on AT-class or
                          better computers).  This is generated by the
                          same hardware that handles the non-volatile data
                          in the CMOS Memory.
Не лучше?
Вот только не помню, где это вкл/выкл-ся... :(

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 22, 2009 18:39 
Не в сети

Зарегистрирован: Вс июн 21, 2009 20:49
Сообщения: 111
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
В Pentium есть специальные регистры для профайлинга, в которых считаются такты проца.
Для других вариантов можно придумать хаки с неиспользуемым железом (оно почти всегда есть).


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 23, 2009 21:12 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
in4 писал(а):
А еще под DOS можно включить прерывание от RTC
Код:
INT 70H IRQ 8 RT Clock    Interrupts 1024 times per second (on AT-class or
                          better computers).  This is generated by the
                          same hardware that handles the non-volatile data
                          in the CMOS Memory.
Не лучше?
Вот только не помню, где это вкл/выкл-ся... :(

Програмировал это давно на паскале, исходники не помню где, но если понадобится
могу найти. Насколько помню там надо после обработки прерывания , обязательно
прочитать регистр статуса, иначе новое прерывание не произойдет.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 41


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB