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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по организации таймера в дривере.  (Прочитано 8392 раз)
0 Пользователей и 1 Гость смотрят эту тему.
V-ctor
Гость
« : 27-11-2003 08:28 » 

Есть задача, дергать из дривера событие с нужным интервалом.
На эти нужды вроде как есть KeInitializeTimer(Ex), KeSetTimer(Ex) и т.п. Опять-таки кто может сказать как это надежней организовать? Я так понимаю есть 2 пути:
1 выделить отдельный процесс и в нем ждать таймер
2 можно вроде как указать DPC для таймера, куда  видимо он будет влетать по таймеру, а там его снова устанавливать
Записан
maaaaaad
Гость
« Ответ #1 : 27-11-2003 12:53 » 

Других вариантов нет. Это все.

Что то начинает попахивать поллингом...
Я думаю нада спрашивать не как это сделать а как этого избежать...
Записан
V-ctor
Гость
« Ответ #2 : 27-11-2003 17:05 » 

Что-то я не пойму вроде прикрутил это дело через KeSetTimerEx, ывзываю свою DPC, и оно типаработает, НО! есть 2 проблемы:
1 (речь о нумеге) при инициализации KTimedCallBack , ругается на Assert, что вписан для метода Initialize(). А именно m_pObject==NULL
2 при попытке пошурудить событие в этом DPC, выскакивает BSOD: ...IRQL_NOT_LESS_OR_EQUAL. Это что значит, что в данном IRQL мне нельзя событиями баловаться? Как это бы обойти?
Записан
maaaaaad
Гость
« Ответ #3 : 27-11-2003 18:57 » 

inline VOID KTimer::Initialize(TIMER_TYPE  type)
{
   KDispatcherObject::Initialize(&m_timer);
   KeInitializeTimerEx(&m_timer, type);
}

inline VOID KDispatcherObject::Initialize(unsigned int size)
{
   if (IsValid())
   {
      ASSERT(m_pObject == NULL);


BOOLEAN IsValid(void){ return (m_pObject != NULL); }

 
PVOID m_pObject обьекта (KDispatcherObject) проинициализирован неправильно. Ошибка то и не здесь.


В вапще, бросайте траву курить. Пишите KeInitializeTimer и KeSetTimer...
Все равно что бы граммотно использовать классы DS надо API знать.
Я точно больше туда (DS) не полезу.
Записан
V-ctor
Гость
« Ответ #4 : 28-11-2003 06:59 » 

Это все так... всё это я накопал, не пойму токо где этот объект чертов инициализирится?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 28-11-2003 08:15 » 

Цитата

Это все так... всё это я накопал, не пойму токо где этот объект чертов инициализирится?


Ну и дурацкий же там класс.
Инициализируется он в конструкторе- их там аж два.
Далее вызывай ф-ции типа KTimer::Set(...) и ей подобные.
Часть ф-ций определена в ktimer.h, а другие в ktimer.cpp- там и все Set функции.
Записан
V-ctor
Гость
« Ответ #6 : 28-11-2003 08:32 » 

Да это действительно дурацкий класс, сделал на КеХХХ все заработало Ага
Вот токо никак меньше 10мс не удается получить интервал Жаль
Почему так долго? Вот мое же аппаратное прерывание махом отрабатывается (в пределах сотен мкс). А тут?
Может если процесс в ядре сделать, то быстрее будет?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #7 : 28-11-2003 10:03 » 

Цитата

Вот токо никак меньше 10мс не удается получить интервал  
Почему так долго? Вот мое же аппаратное прерывание махом отрабатывается (в пределах сотен мкс). А тут?
Может если процесс в ядре сделать, то быстрее будет?


Ты как с таймером работаешь- ждешь на KeWaitForSingleObject? Если да, то не рассчитывай на точность и малые интервалы. 10мс- это (по порядку величины) квант времени одного потока, характерная величина, именно она определяет погрешность функций, основанных на перепланировке потоков. Все ф-ции типа KeWaitForSingleObject работают по принципу- если вызваны с ненулевым временем ожидания и объект не в сигнальном состоянии, то вызывается планировщик потоков, поток вызвавший ф-цию снимается с процессора и переносится в список потоков НЕ запланированных на выполнение, когда объект переходит в сигнальное состояние то поток переводистя в список потоков запланированных на выполнение, но когда он реально получит доступ к процессору не определно, это зависит от других, более приоритетных потоков, вот и выходит 10 мс- ниже труднее.

 Также 10 мс - это интервал системного таймера(system clock или это системные часы?). Может именно он и влияет на точность. Не скажу сразу как работают программные таймеры, если от системного таймера- то поэтому 10 мс минимальный интервал. Также при отсутствии других прерываний DPC вызываются именно через 10 ms после отработки ISR системного таймера, но могут и чаще, если какой-то поток сам отдает управление и вызывает планировщик или поднимает IRQL процессора до DISPATCH_LEVEL.

 Процессов в ядре не бывает- там только системные потоки(без пользовательского адресного пространства), планируются потоки в соответствии с их приоритетом в независимости от того системный он или пользовательский.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines