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

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

ru
Offline Offline

« : 05-02-2009 07:06 » 

Привет!

Доделал я таки свой проект, в кратце напомню в чем он заключался. Есть плата, подключаемая к компу по PCI, на ней стоит ПЛИС, для которой я разрабатывал прошивку, поддерживающую блочную передачу на шине, а так же драйвер под виндуос, позволяющий устройству обращаться в память компьютера по каналам DMA. Все как обычно, драйвер получает от системы логический адрес для обращения в память, записывает его и длину передачи в регистры устройства и командует ему начать передачу. После этого устройство само обращается в память компьютера по этому адресу, считывает или записывает туда указанный объем данных и после этого выдает прерывание, что типа все закончило, которое обрабатывается драйвером, снимается, и IRP запрос завершается.
Все отлично работает, когда драйвер встраивается в уже загруженную систему. Но если встроить драйвер, а потом просто перезагрузить компьютер (при этом питание с шины PCI как я понимаю не снимается, и конфигурация железа (т.е. ПЛИС) остается неизменной), то происходит странная вещь: начинает вызываться функция обработчика прерывания ISR (я мониторю активность драйвера через WinDbg, которой стартует вместе с системой). Вызывается она бесконечно. На самом деле устройство не выдает никакого прерывания (я знаю этого, т.к. использую логический анализатор, встроенный в кристалл ПЛИС), а функция обработчика прерывания вызывается бесконечно, ничего не делает, т.к. там в ней сначала есть проверка, мое ли устройство выдает прерывание. При этом система загружается (правда медленно). После загрузки я просто отключаю драйвер, а потом снова его задействую, и тогда все ок, никаких ISR не вызывается. При этом, если перед перезагрузкой системы отключить устройство, а после перезагрузки его задействовать, то опять же все нормально.

Глюк? Я что-то не так делаю? может у кого были подобные ситуации?
Записан
Ochkarik
Модератор

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

« Ответ #1 : 06-02-2009 10:02 » 

скорее всего что то с деинициализацией ресурсов не так...
посмотрите внимательней как вы отключаете обработчик прерывания. кроме того там надо очередь DpcForIsr освободить...

у меня было такое что я в сон по питанию S1-S2 не мог войти(в S3 гибернацию - нормально).
при пробуждении - система перезагружалась... до сих пор не справился - не до этого.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
urock
Участник

ru
Offline Offline

« Ответ #2 : 19-02-2009 12:36 » 

Не могли бы вы рассказать, как освобождать очередь DpcForIsr? не могу найти нужную функцию...

А IoDisconnectInterrupt я действительно не вызывал перед перезагрузкой системы, хотя как оказалось, даже отключая обработчик прерывания, после перезагрузки обработчик продолжает вызываться...
Записан
Ochkarik
Модератор

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

« Ответ #3 : 19-02-2009 22:56 » 

точно не уверен... попробуйте KeRemoveQueueDpc()
скорее всего она.
да, разумеется перед IoDisconnectInterrupt , вы должны еще своей железке запретить прерывания генерить!
запретить прерывания, IoDisconnectInterrupt и очистить очередь.
PS отпишитесь что с этим получится... очень интересная мне тема)
« Последнее редактирование: 19-02-2009 22:58 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
urock
Участник

ru
Offline Offline

« Ответ #4 : 16-03-2009 09:19 » 

я так понял, что просто вместе с моей железкой на одном прерывании сидело что-то еще - отсюда и вызовы ISR
Записан
Рыжий Тигра
Гость
« Ответ #5 : 27-04-2009 11:15 » 

urock > вместе с моей железкой на одном прерывании сидело что-то еще
Этого для такого эффекта мало. Скорее всего, уже после отключения обработчика прерывания (возможно - в процессе перезагрузки) устройство выставляет уровень на линию прерывания. Если линия расшарена с прерыванием от, к примеру, видеокарты или диска - то как раз похожее и будет: прерывание - драйвер видяхи говорит "не моё" - диспетчер гоняет кругами.)
А похоже себя ведут DSP семейства 5416 Техасского инструментального завода Улыбаюсь : после перезапуска его HPI рожает прерывание - сигналит о том, что можно грузить микропрограмму. Поэтому при закрытии устройства не мешало бы блокировать железке возможность выдачи прерываний, тогда опасность будет только если при его работе нажать reset.
« Последнее редактирование: 27-04-2009 11:50 от Рыжий Тигра » Записан
WWX
Постоялец

ru
Offline Offline

« Ответ #6 : 31-10-2019 09:52 » 

Очень похожая ситуация.

Только ложные вызовы обработчика прерывания вызываются даже после включения системы, не только после перезагрузки. В таком порядке:
- Сначала 5 прерываний с 0.15 мс интервалом (примерно).
- Затем в течении чуть менее 0.5 с отсутствие прерываний.
- Потом всё повторяется.
(Итого: 10 прерываний за секунду.)

Если заставить устройство выставить сигнал прерывания, то прерывания (что естественно) посыплются гораздо быстрее (ISR в порядке эксперимента всегда возвращает FALSE).
Если затем снять сигнал прерывания, то прерывания начинают сыпаться как и раньше (примерно 10 раз в секунду).

Выгрузка и загрузка драйвера убирает все ложные прерывания (до перезагрузки).

В принципе систему то они особо не нагружают, но хотелось бы понять их причину.

Не похоже, чтобы была виновата деинициализация прерывания в драйвере, или чтобы устройство самопроизвольно выставляло сигнал прерывания при загрузке системы.
Записан
Ochkarik
Модератор

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

« Ответ #7 : 31-10-2019 12:41 » 

посмотрите дерево устройств. вид дерева выбираете "по ресурсам" раздел прерываний, смотрите кто еще висит на том же.
если на одном прерывании два устройство - то первое из них будет получать прерывания от обоих устройств.
перезагрузка драйвера - меняет очередность обработки.  второе по очереди получает уже только отфильтрованные первым прерывания.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WWX
Постоялец

ru
Offline Offline

« Ответ #8 : 31-10-2019 14:19 » 

Вот, блин... Я мог бы и сам догадаться.
Просто я почему-то ошибочно решил, что маловероятно, что придётся с кем-то делиться прерыванием (но такую возможность всегда предусматривал).

Спасибо в любом случае, вы мне очень помогли.
Записан
Ochkarik
Модератор

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

« Ответ #9 : 31-10-2019 17:09 » 

да я сам когда-то долго не мог понять, как это может быть - одно прерывание на два устройства, и как они их различать должны)))
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines