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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Может кто поможет разобраться с таймером?  (Прочитано 6371 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Umka
Гость
« : 27-05-2004 07:07 » 

Почему при IRP_MJ_READ не работает таймер?
Решил провести чистый эксперимент
Сделал следующее:

при IRP_MJ_READ       вызываю TTTDevice::SerialRead(KIrp I)
при IRP_MJ_DEVICE_CONTROL       вызываю допустим TTTDevice::ReadBlock(KIrp I)

в этих функциях вызываю следующую функцию и смотрю в отладчике последние значения
m_Timer.State()  и i
Код:
BOOLEAN TTTDevice::GetTimeout()
{
ULONG i;
BOOLEAN stat;
t<<"Timer IsValid "<< m_Timer.IsValid()<<EOL;
stat=m_Timer.Set(RtlConvertLongToLargeInteger(READ_TIMEOUT),LinkTo(TimerCallback),this);
t<<"Timer start status "<< stat<<EOL;
for(i=0;i<40000000;i++)
{
stat=m_Timer.State();
if(stat)
{
t<<"Timer status1 "<< m_Timer.IsValid()<<EOL;
t<<"Timer Irq1="<< stat <<EOL;
t<<"Count Irq1="<< i <<EOL;
m_Timer.Cancel();
return TRUE;
}
}//end for
t<<"Timer status2 "<< m_Timer.IsValid()<<EOL;
t<<"Timer Irq2="<< stat <<EOL;
t<<"Count Irq2="<< i <<EOL;
m_Timer.Cancel();
return FALSE;
}
В результате при IRP_MJ_DEVICE_CONTROL выхожу по сигналу таймера stat=TRUE,
а при IRP_MJ_READ по концу цикла (если цикл сделать бесконечный, то все виснет) stat=FALSE i=40000000
В документации написано про KTimer::State  :
 
The caller must be running at IRQL <= DISPATCH_LEVEL (2).

Это что же? в этих случаях работаем при разных IRQL?

И как быть, если таймер жизненно необходим?

Юзаю VC++6.0 Numega 2.6
« Последнее редактирование: 25-11-2007 21:59 от Алексей1153++ » Записан
Umka
Гость
« Ответ #1 : 28-05-2004 06:30 » 

Никто не хочет помочь...
Решил воткнуть опрос CMOS таймера - типа

Код:
ULONG GetTime()
{
_asm
{
mov ax,0h
out 70h,al
in al, 71h
}
}
Вроде работает, но где подводные камни?
Неужели все так просто?
« Последнее редактирование: 25-11-2007 22:00 от Алексей1153++ » Записан
Amun Shu
Гость
« Ответ #2 : 29-05-2004 17:07 » 

Немного не понял - тебе надо просто мерять время??
попробуй поюзать KeQueryPerformanceCounter
Записан
maaaaaad
Гость
« Ответ #3 : 29-05-2004 18:58 » new

KeQuerySystemTime или сам напиши используя RTDS процессорные тики в eax:ebx
Записан
Umka
Гость
« Ответ #4 : 02-06-2004 11:14 » 

Да, именно так!
Это то что нужно. Спасибо.
Мир не без добрых людей.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines