Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вызовы процедуры с периодом от 0,5мсек  (Прочитано 17379 раз)
0 Пользователей и 1 Гость смотрят эту тему.
N1ghtroad
Интересующийся

ru
Offline Offline

« : 18-07-2010 20:09 » 

Здравствуйте, уважаемые.
Столкнулся я с проблемой, и никак не могу её победить (а сроки поджимают).
Суть проблемы такова: необходимо мне производить некоторое простейшее действие с периодом от миллисекунды (или даже 0,5мсек) до десятков миллисекунд. Под Win.
В User mode я почти этого добился, пользуясь Sleep(0) и PreformanceCounter'ом.
Но на одноядерных машинах система временами (обновление экрана, например) напрочь сбивала мне все тайминги и отъедала просто непреличные куски времени.
Умные люди посоветовали пересмотреть всю концепцию разработки, или, на крайний случай, перекинуть кусок программы в Kernel mode.
А вопрос, собственно, такой: чем и как мне можно тактовать время с такой частотой?
Период, если это важно, изменяется каждый такт, но можно, впринципе, менять и с меньшей частотой. Главное чтобы резких скачков между вызовами процедуры не было.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 19-07-2010 10:55 » 

посмотрите в сторону KeInitializeTimerEx

но боюсь в (общем виде) ОС Windows в принципе на это не рассчитана. если и получится у вас результат - то не уверен что результат будет стабильным... там примерно те же проблемы возникают.

кстати аппаратный ACPI таймер Windows работает(кажется) на частоте 3.579545 МГц. и например PreformanceCounter (тот, который  должен использовать rdtsc) некоторое время назад  на некоторых процессорах перестал возвращать число тактов процессора, а вместо этого выдает этот 3МГц таймер. я сталкивался с этим на некоторых ноутбуках.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
N1ghtroad
Интересующийся

ru
Offline Offline

« Ответ #2 : 19-07-2010 12:24 » 

Ochkarik,
Пробовал. Получил периодичность в 10мсек.
Правда, пока пользовался KeWaitForSingleObject чтобы отслеживать сработку. Может через DPC будет побыстрее?.. Пойду проверять.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 19-07-2010 18:46 » 

лучше через DPC. они пошустрее, там одна беда - чтобы никто другой очередь DPC не засир... не тормозил)
и кстати там есть период - он задается мс. а есть задержка - в 100нс интервалах Ага
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
N1ghtroad
Интересующийся

ru
Offline Offline

« Ответ #4 : 19-07-2010 20:18 » 

Ochkarik,
DPC, к сожалению, не помог. Либо я его не так приготовил.
Задержки пробовал задавать разные, в итоге всегда получал значения, кратные 10мсек.
Собственно, достаточно часто натыкаюсь на упоминание этого числа, и на этом форуме тоже.
Может, есть какой метод отдавать системе управление на некий минимальный квант, нечто уровня Sleep(0) в юзере? Время я уж как-нибудь посчитаю, да хоть бы и через KeQueryPerformanceCounter. Хотя, в таком случае опять может система свинью подложить.

Появилась мысль организовать небольшой буфер, значений на 16, и отдавать его по аппаратному прерыванию, тем более что все равно это счастье должно обслуживать внешнюю девайсину на COM-порте. Правильнее было б, конечно, сделать буфер в самой девайсине, и забивать его стандартными но нельзя.
Не подскажите, реализуем ли такой подход и насколько он логичен и сложен? Хотя, это в любом случае будет запаска, лучше б чисто программное решение.

//эх, мне б сейчас лампочками на LPT мигать, да DbgPrint'ы во вьювере ловить, а приходится ударными темпами в дебри скакать...
Записан
zubr
Гость
« Ответ #5 : 20-07-2010 02:55 » 

Может есть смысл воспользоваться инструкциями процессора cli sti для одноядерных процессоров.
Записан
N1ghtroad
Интересующийся

ru
Offline Offline

« Ответ #6 : 20-07-2010 05:48 » 

zubr,
Слабо представляю, как это может мне помочь.
У меня процесс не прерывается, у меня в нужный момент, когда пора очередной пакет данных отсылать, к нему управление не возвращается. А занимать систему полностью на все время работы не вариант, ибо это полчаса, а то и больше.
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #7 : 20-07-2010 08:10 » 

Задержки пробовал задавать разные, в итоге всегда получал значения, кратные 10мсек.
Собственно, достаточно часто натыкаюсь на упоминание этого числа, и на этом форуме тоже.
Есть подозрение, что в данном случае 10 мс - это значение тика таймера в системе, оно зависит от машины, я видел значения и 16 мс.
Может, есть какой метод отдавать системе управление на некий минимальный квант, нечто уровня Sleep(0) в юзере?
Sleep(0) это не минимальный квант, насколько я помню, а практически кооперативная многозадачность, т.е. попытка отдачи своего кванта более высокоприоритетному процессу, если таковой имеется, а если нет - продолжение собственной работы.

Посмотрите в сторону KeDelayExecutionThread(), возможно он сможет то, что Вам нужно.
« Последнее редактирование: 20-07-2010 08:24 от darkelf » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 20-07-2010 09:07 » 

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

Добавлено через 14 минут и 30 секунд:
для win2000 было:
boot.ini
/TIMERS=
разрешение системного таймера в 100нс. по умолчанию стоит 78125 что соответствует 7.8мс
/TIMERS=21000 устанавливает 2мс.
9766  - 0.98
19532  2,0
39063 - 3,90
78125 - 7,8
скопипастил с книги. лучше поискать и проверить инфу на msdn...
в MSDN ни слова... откуда руссинович взял такой свич - не знаю...
« Последнее редактирование: 20-07-2010 09:21 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
N1ghtroad
Интересующийся

ru
Offline Offline

« Ответ #9 : 20-07-2010 09:36 » 

darkelf,
Попробовал,с нулевым периодом вроде бы долбит достаточно часто и достаточно ровно, систему при этом не вешает. С единицой - опять 10мсек. Попробую набить более-менее рабочую версию и проверить с реальной железкой.
И, похоже, наткнулся на особенность утилиты DebugView, она странно пересчитывает время в clock-режиме.
И да, 10мсек это значение тика. У меня на тестовой машине 10мсек, на соседнем двухголовом атлоне - 15.

Ochkarik,
Немного не то. У меня рабочие периоды от 0,7мсек до 3,5 примерно, изредка возрастает до десятков мсек. Шаги по 0,98мсек не спасут. Да и система может странно отнестись к таким вещам, как мне кажется.

А до тех самых 100нс добраться нельзя? Ловить с них прерывание и суммировать до нужной суммы. Ну и, соответственно, по переполнению вызывать обмен через DPC или еще как.
Хотя, я так понимаю, там просто уменьшается некий счетчик, а прерывание происходит только в момент достижения им нуля.
« Последнее редактирование: 20-07-2010 09:49 от N1ghtroad » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 20-07-2010 13:32 » 

думаю до 100нан добраться не получится. это скорее всего просто с запасом выбрали единицу измерений....
максимум что теоретически возможно получить - ACPI таймер. если не перепрограммировать.
можно наверное как-нибудь подсесть на прерывания этого таймера.. но как - увы не разбирался никогда, не специалист... это может быть на форумах wasm стоит посмотреть.

еще, теоретически есть такие продукты реального времени на подобии IntervalZero RTX(разделе "embeded" обзор делал) - они помимо всего прочего как раз должны вешать свой обработчик на системный таймер. и опционально позволяют его перепрограммировать на другие частоты. но они все денег стоят.


Добавлено через 8 часов, 53 минуты и 7 секунд:
посмотрите
может натолкнет на идеи...
и вот эту пожалуй сначала... небезинтересно. хакинг сплошной, но других вариантов нет

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

PPS может быть имеет смысл перехватывать IQR второго таймера...
и из ссылок Interrupt Hooking and retrieving device information on Windows NT/2000/XP
и вот эта Detours может быть пригодится... пока только мельком смотрел... но если я правильно понял то есть о чем.... Здесь была моя ладья...
« Последнее редактирование: 20-07-2010 22:25 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
N1ghtroad
Интересующийся

ru
Offline Offline

« Ответ #11 : 21-07-2010 08:04 » 

Ochkarik,
Бегло просмотрел, интересные статьи. Как смогу выделить очередной time slice - изучу подробнее.
Сейчас нашел временное решение, за день-другой накидаю код и вернусь к драйверам.
О прогрессе, естественно, буду отписывать.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 21-07-2010 15:27 » 

N1ghtroad, хорошо если найдется время. а то который раз вопрос на форуме поднимается и все никак не разрешится толком)
меня примерно из за этого заставили RTX запустить. купили даже... бешенные деньги)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 03-08-2010 16:46 » 

кстати... никто не пробовал? сколько можно поставить?
ExSetTimerResolution
Цитата
The ExSetTimerResolution routine modifies the frequency at which the system clock interrupts. Use this routine with extreme caution (see the following Remarks section).
оно правда "The minimum value is approximately 10,000 (1 millisecond) but can vary slightly by platform." но кто его точно знает?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 23-08-2010 19:29 » new

в тему изготовления точного таймера. выкладываю ссылку о перехвате функции переключения контекстов. наверное может пригодится... когда нибудь)
http://www.wasm.ru/article.php?article=hiddndt
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines