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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработка прерываний  (Прочитано 11321 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
Grave_Digger
Гость
« : 29-01-2004 11:12 » 

Люди, простите за ламерский вопрос, не подскажет ли кто-нибудь как организовывать сабж. Что я имею в виду:
1. Написал драйвер для PCI, могу писать в нее и читать из нее.
Теперь хочу сделать так чтобы карта PCI информировала пользовательское приложение  когда можно считывать данные с PCI карты. Т.е. PCI - дает прерывание о том что можно забирать данные. Вот никак не могу понять как это получше сделать.
2. Как драйверу сообщить пользовательскому приложению и прерывании...
Буду благодарен за любую помощь, а особенно исходники
 Улыбаюсь
Заранее спасибо.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 29-01-2004 11:21 » 

Цитата

 Как драйверу сообщить пользовательскому приложению и прерывании...


Это называется взаимодействие пользовательского приложения и драйвера. Сразу скажу- из процедуры обработки прерывания ISR этого не делают, обычно из DPC или системного потока. Наверно наиболее приемлемо будет переводить разделяемый event в сигнальное состояние. Как варианты- разделяемая память, ожидание приложения на NtReadFile, но это все как-то не очень красиво. Читай об взаимодействии драйвер-приложение вот тут  http://www.osronline.com/article.cfm?id=108   статью  "Sharing Is Caring - Sharing Events Between Kernel-User Mode " и обсуждение в конце статьи.
Записан
Anonymous
Гость
« Ответ #2 : 29-01-2004 12:02 » 

Воть те пример только сам разбирайся   Улыбаюсь

Код:


BOOLEAN InterruptHook)PKINTERRUPT Interupt,
  PVOID ServiceContext: |

    BOOLEAN ourDeviceInterrupting = FALSE; // int is't our
    PXWDM_DEVICE_EXT devExt = )PXWDM_DEVICE_EXT: ServiceContext;



DP)"Hook ISR entered\n":;
devExt->BaseRegisterAddr = 0xd000;

// Read Interrupt FLAGS
IRQState = READ_PORT_ULONG)devExt->BaseRegisterAddr + INT_REG:;

// Detect Interrupts...
if )IRQState & INTX_PRESENT: |
DP)"Our Interrupt Occur )INT FLAG 0x%x:\n", IRQState:;
DUMPIRQState)IRQState:;
ourDeviceInterrupting = TRUE;
"
else | // Someone Else Interrupt
return ourDeviceInterrupting;
"

if )I2C_ACTIVE:
|
// Blocks Global Interrupts
WRITE_PORT_ULONG)devExt->BaseRegisterAddr + BASE_REG,
GLOBAL_RESET_STATE:;
"

/****   WORKING WITH OUT INTERRUPTS   ****/
IoRequestDpc)
devExt->DeviceObject, // DeviceObject )XWDM:
NULL, // pIrp )No:
NULL // Context )No:
:;


/*

// We have IRQ0 Interrupt
if )IRQState & IRQ0_PRESENT: |
DP)"User Interrupt Occur!\n":;
// Disale IRQ0 now
WRITE_PORT_ULONG)devExt->BaseRegisterAddr + BASE_REG,
GLOBAL_RESET_STATE:;
"


*/

// Global Disable Interrupts
WRITE_PORT_ULONG)devExt->BaseRegisterAddr + BASE_REG,
GLOBAL_RESET_STATE:;



DP)"Hook ISR leaving\n":;
return ourDeviceInterrupting;
"

Записан
Anonymous
Гость
« Ответ #3 : 29-01-2004 12:05 » 

Воть DPC  (шеф отвернулся)  Жжешь

Код:

VOID DpcForIsrHook)PKDPC Dpc, PDEVICE_OBJECT DeviceObject,
 PIRP Unused, PVOID Context: |

    PXWDM_DEVICE_EXT devExt =
)PXWDM_DEVICE_EXT: DeviceObject->DeviceExtension;
       
    DbgPrint)DRIVER_NAME "*** DPCHook called\n":;


// Working With I2C...
if )I2C_ACTIVE: |
// Check I2C Interrupt prresent
if )IRQState & IRQ3_PRESENT: |
DP)DRIVER_NAME ")DPC: I2C Interrupt Detected!\n":;
KeSetEvent)&WaitI2CInterrupt,
0, // Èíêðåìåíò ïðèîðèòåòà
FALSE // Íå ïåðåõîäèòü ê waitforsingleobject ñðàçó
:;
//
// Disale IRQ0 now
WRITE_PORT_ULONG)devExt->BaseRegisterAddr + BASE_REG,
GLOBAL_RESET_STATE:;
"
"

DbgPrint)DRIVER_NAME "*** DPCHook leaving\n":;
return;
"
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #4 : 29-01-2004 12:14 » 

Цитата

Èíêðåìåíò


Ух ты Отлично . Ты на каком языке комментарии пишешь?
Записан
Grave_Digger
Гость
« Ответ #5 : 29-01-2004 12:28 » 

Спасибо, попробую разобраться Улыбаюсь
Записан
dachny
Гость
« Ответ #6 : 29-01-2004 12:51 » 

Первая ошибка
Цитата

Теперь хочу сделать так чтобы карта PCI информировала пользовательское приложение когда можно считывать данные с PCI карты. Т.е. PCI - дает прерывание о том что можно забирать данные. Вот никак не могу понять как это получше сделать.

Прерыванием надо информировать не апликацию а драйвер потому что суть прерывания ВЫЗВАТЬ НЕМЕТЛЕДННУЮ РЕАКЦИЮ СИСТЕМЫ НА АППАРАТНОЕ СОБЫТИЕ Короче чтобы не далало преложение в ответ на евент от прерывания ето будет делаться в юзер моде в ПАССИВЕ то есть грубо говоря в резиновом а НЕ В РЕАЛЬНОМ ВРЕМЕНИ с таким же успехом ты можешь опрашивать регистер в своей плате из нити работающей в апликации будут такие же тормоза и потери данных

Второе
Никто не запрещает тебе в ISR делать что либо кроме запуска DPC иначе бы про ISR в ДДК не было упоминания оно было бы просто сратано с глаз долой

Третье
прерывания у ПСАй  расшаренные и ето надо учитывать

Алгоритм
1) аппаратное прерывание тоесть дернулась нога например INTA
2) входим в ISR сопоставтенного прерывания например IRQ11
3) в ТЕЛЕ ISR проверяем МОЕ ЛИ ЭТО ПРЕРАВАНИЕ читая заранее заготовленный регистр на плате или предоставленный разработчиком чипа
4а) Если не мое выходим из ISR не делая больше ничего и возращаем FALSE
4б) Если мое запрещаем прерывания грубо говоря блокируем ногу INTA у платы
5б) далее по вкусу либо ставим в очередь DPC и возращаем TRUE , либо читаем данные разрешаем INTA и возращаем TRUE ( пару регистров в ISR причитать не криминал, я например в ISR делал memcpy из CommonБуффера ДМА и пререконфигурил ДМА движок и ничего)
6) Если использовал DPC в конце DPC разрешаем прерывания
7) а вот гогда появятся данные в драйверном буфере (ФИФО СПИСКЕ ) в достаточном объеме вот тогда и сигналь евентом
Записан
Anonymous
Гость
« Ответ #7 : 29-01-2004 14:37 » new

Цитата

Ух ты  . Ты на каком языке комментарии пишешь?


На цнглицком (для отчетности), а ругательства - на бусурманском
Записан
Anonymous
Гость
« Ответ #8 : 29-01-2004 14:37 » 

PS
а ругательства - на бусурманском (для себя)  Жжешь
Записан
Anonymous
Гость
« Ответ #9 : 29-01-2004 14:43 » 

Хм... в теории мне это понятно.. осталось дело за малым, написать Улыбаюсь
Вот еще не очень понятная вещь.
У меня драйвер связан с приложением через dll т.е. драйвер -> dll -> приложение. Если драйвер узнал, что поймал свое прерывание, то он сигналит об этом, но куда (тока в длл) Не понял А dll  никак не может приложению сообщить об этом... Или я чего-то не понимаю...
Уж простите что задаю стока глупых вопросов...Улыбаюсь Занимаюсь подобными вещами впервые.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #10 : 29-01-2004 14:53 » 

Цитата

Или я чего-то не понимаю...


Именно так.
DLL- неотъемная часть приложения и может сигналить ему как угодно. Запускай из приложения отдельный поток и вызывай из него функцию из dll, а в ф-ции dll вызывай WaitForSingleObject на разделяемый с драйвером event.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines