urock
Участник
Offline
|
|
« : 05-02-2009 07:06 » |
|
Привет!
Доделал я таки свой проект, в кратце напомню в чем он заключался. Есть плата, подключаемая к компу по PCI, на ней стоит ПЛИС, для которой я разрабатывал прошивку, поддерживающую блочную передачу на шине, а так же драйвер под виндуос, позволяющий устройству обращаться в память компьютера по каналам DMA. Все как обычно, драйвер получает от системы логический адрес для обращения в память, записывает его и длину передачи в регистры устройства и командует ему начать передачу. После этого устройство само обращается в память компьютера по этому адресу, считывает или записывает туда указанный объем данных и после этого выдает прерывание, что типа все закончило, которое обрабатывается драйвером, снимается, и IRP запрос завершается. Все отлично работает, когда драйвер встраивается в уже загруженную систему. Но если встроить драйвер, а потом просто перезагрузить компьютер (при этом питание с шины PCI как я понимаю не снимается, и конфигурация железа (т.е. ПЛИС) остается неизменной), то происходит странная вещь: начинает вызываться функция обработчика прерывания ISR (я мониторю активность драйвера через WinDbg, которой стартует вместе с системой). Вызывается она бесконечно. На самом деле устройство не выдает никакого прерывания (я знаю этого, т.к. использую логический анализатор, встроенный в кристалл ПЛИС), а функция обработчика прерывания вызывается бесконечно, ничего не делает, т.к. там в ней сначала есть проверка, мое ли устройство выдает прерывание. При этом система загружается (правда медленно). После загрузки я просто отключаю драйвер, а потом снова его задействую, и тогда все ок, никаких ISR не вызывается. При этом, если перед перезагрузкой системы отключить устройство, а после перезагрузки его задействовать, то опять же все нормально.
Глюк? Я что-то не так делаю? может у кого были подобные ситуации?
|