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

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

ru
Offline Offline

« : 05-04-2011 08:24 » 

День добрый! В очередной раз огорчившись тем как winlirc отваливается при запуске высокоприоритетных процессов вроде видеоплейера я решил  написать дровинку, которая будет собирать статистику с СОМ порта более оперативно, чем WaitForCommEvent. Приемник ИК подсоединен к DCD пину COM порта, соотвественно надо перехватить прерывание от порта и проанализировать состояние пина - сложить в массив временную метку и состояние линии, дернуть евент для юзермода - типа пусть вычитывает. Проблема возникла с подсоединением прерывания, вот такой код проваливается:
Код:
KIRQL     kIrql;
KAFFINITY kAffinity;

ULONG kVector = HalGetInterruptVector(PCIBus, 0, COM_PORT_IRQ, COM_PORT_IRQ,
                     &kIrql,    &kAffinity);
status = IoConnectInterrupt (
            &dx->pIntObj,
            Isr,      
            dx,  
            NULL,    
            kVector,  
            kIrql,     // DIRQL
            kIrql,     // DIRQL
            LevelSensitive,  
            TRUE,  
            kAffinity,
            FALSE );
Irq=4 не аттачится, функция возвращает  STATUS_INVALID_PARAMETER. Вычитал про регистрацию ресурсов В\В пробовал так:
Код:
CM_RESOURCE_LIST rlist;
rlist.Count = 1;
rlist.List[1].InterfaceType = Isa;
rlist.List[1].BusNumber = -1;
rlist.List[1].PartialResourceList.Version = 1;
rlist.List[1].PartialResourceList.Revision = 1;
rlist.List[1].PartialResourceList.Count = 1;
rlist.List[1].PartialResourceList.PartialDescriptors[1].Type = CmResourceTypeInterrupt;
rlist.List[1].PartialResourceList.PartialDescriptors[1].ShareDisposition = CmResourceShareShared;
rlist.List[1].PartialResourceList.PartialDescriptors[1].Flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE;
rlist.List[1].PartialResourceList.PartialDescriptors[1].u.Interrupt.Level = kIrql;
rlist.List[1].PartialResourceList.PartialDescriptors[1].u.Interrupt.Vector= kVector;
rlist.List[1].PartialResourceList.PartialDescriptors[1].u.Interrupt.Affinity = kAffinity;

BOOLEAN bConflict;
status = IoReportResourceForDetection(
DriverObject,
&rlist,
sizeof(rlist),
NULL,
NULL,
0,
&bConflict
);

Конфликтов не обнаруживается, но после этого тоже самое. Попытка зарегистрировать девайс проваливается:
Код:
status = IoCreateDevice(DriverObject,
                            sizeof(EXAMPLE_DEVICE_EXTENSION),
                            &devName, // ìîæåò áûòü è NULL
                            FILE_DEVICE_UNKNOWN,
                            0,
                            FALSE, // áåç ýêñêëþçèâíîãî äîñòóïà
                            &fdo);
if(!NT_SUCCESS(status)) return status;

status = IoReportDetectedDevice( //FAIL
DriverObject,
Isa,
-1,
-1,
&rlist,
NULL,
TRUE,
&fdo
);
возвращается код STATUS_NO_SUCH_DEVICE. Не знаю что делать  что не так. Помогите пожалуйста! OS-WinXP SP2
« Последнее редактирование: 05-04-2011 09:30 от dimedrol » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
Ochkarik
Модератор

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

« Ответ #1 : 05-04-2011 10:52 » 

немного не понял, вы хотите второй обработчик на одно прерывание повесить? или полностью заменить serial.sys
может проще serial.sys "допилить"?)

C:\DDK\3790.1830\src\kernel\serial\
попробуйте скомпилить дебажную версию serial и подмеить родной драйвер(не знаю насколько она отличается от родной), вы сможете увидеть с какими параметрами захватывается прерывание порта родным драйвером... может оно не расшариваемое? или еще что то отличается.
MSDN довольно пространно  об этой возможности написано:
When a device is opened, Serial allocates the interrupt to the device. When a device is closed, the driver releases the interrupt for use by another device.

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

PPPS кстати о настройках родного драйвера в реестре и о целом разделе MSDN в частности
PermitShare (REG_DWORD)
Specifies a Boolean flag that indicates whether to permit the system to share the interrupt that a port uses. If PermitShare is nonzero, the interrupt can be shared; otherwise, the interrupt cannot be shared. The default value of PermitShare is 0x00000000. If the entry value is not present, Serial sets a PermitShare entry value to the default value."

PPPPS последнее касалось расшаренного использования com порта приложениями.
« Последнее редактирование: 09-04-2011 18:53 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dimedrol
Помогающий

ru
Offline Offline

« Ответ #2 : 05-04-2011 11:31 » 

Вообще я хотел подцепить еще один свой обработкчик. Параметр permitShare ничего не дал - все как было
Пожалуй правда стоит попробовать доработать  serial из DDK, хотя и не хочется - кто знает насколько он хорош в деле и чем отличается от стандартного системного, хотя навскидку вроде инсталлировался и заработал.
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
Ochkarik
Модератор

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

« Ответ #3 : 05-04-2011 11:45 » new

dimedrol, он у вас отладочные сообщения выдает? там среди них должно быть сообщение о параметрах захвата прерывания

Добавлено через 5 минут и 9 секунд:
выложите лог, если не сложно, мне тоже интересно)

Добавлено через 3 минуты и 18 секунд:
только сейчас заметил. возможно для отладки там надо в реестре ключик взвести "DebugLevel"...

Добавлено через 40 минут и 11 секунд:
кстати вы когда PermitShare выставили - вы драйвер перезагрузили? он на ходу не работает возможно...
« Последнее редактирование: 05-04-2011 12:34 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dimedrol
Помогающий

ru
Offline Offline

« Ответ #4 : 05-04-2011 13:28 » 

PermitShare - перезагрузил, ноль эмоций. Лог почему-то не получается, пока не пойму почему, вроде все поставил, установил драйвер. Буду разбираться.
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
Ochkarik
Модератор

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

« Ответ #5 : 05-04-2011 14:10 » 

наверное это?
http://support.microsoft.com/kb/314743
Serial.sys (в Windows 2000 и системах под управлением Windows XP).
ЗначениеDebugLevelзначение в реестре, как показано ниже:
     HKLM\System\CurrentControlSet\Services\Serial “ DebugLevel ” = REG_DWORD:0xFFFFFFFF
Значения маски определяются в следующей папке:
     %DDKROOT%\src\kernel\serial\serial.h
« Последнее редактирование: 05-04-2011 14:14 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dimedrol
Помогающий

ru
Offline Offline

« Ответ #6 : 06-04-2011 10:09 » 

Код:
IoConnectInterrupt Args:
Interrupt           89e49198
OurIsr              b2b8ff22
OurIsrContext       89d722d0
NULL
Vector              191
Irql                8
InterruptMode       1
InterruptShareable  0
ProcessorAffinity   1
FALSE
мда, не шарабельное прерывание Жаль

Добавлено через 2 часа, 27 минут и 35 секунд:
Списибо, Ochkarik! В итоге я восgользовался советом во втором посте - допилил serial из примеров DDK Улыбаюсь добавление очереди из 1000 DCD дескрипторов в самом драйвере сильно улучшило положение с WinLIRC  Отлично Класс! больше ни малейших намеков на подвисание, правда пришлось еще написать плагин, благо на svn есть исходники стандартного SerialDevice - его и допилил.
PS драйвер ставил прямо из диспетчера устройств, на СОМ порт -> Обновить драйвер
PPS седня жену порадую, давно хотела лентяйку к компу
« Последнее редактирование: 06-04-2011 12:37 от dimedrol » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
Ochkarik
Модератор

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

« Ответ #7 : 06-04-2011 14:11 » 

вот и славно))
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines