Полная версия этой страницы:
PCI под Win XP SP1 и SP2.
Zwerg_nase
Mar 1 2006, 07:46
Какая может быть разница в работе PCI под Win XP Service Pack 1 и Service Pack 2?
Есть PCI девайс, сделанный на корке Altera pci_mt32. Девайс выполняет Burst Master Memory Writes по 8 DWORDов, после передачи буфера 28 К девайс выставляет прерывание INTA. Драйвер девайса обрабатывает прерывание и посылает команду девайсу снять INTA.
Так вот, под Win XP SP1 это работает, а под SP2 это почти сразу зависает. Менял размер буфера: такая же хрень, только виснет чуть позже.
Скорее всего проблема в том, что прерывание не снимается. Если прерывание не снять, винда 100% виснет. Почему это происходит именно в SP2 непонятно. Проверьте, что на PCI прерывание точно снимается, на лампочку напривер его выведите. Каком драйвером пользуетесь, самодельным?
Zwerg_nase
Mar 3 2006, 11:19
Драйвер самодельный, сделан в DDK. Прерывание не успевает выставляться (соответствующая лампочка имеется), т.е. зависание происходит до того, как передан весь буфер.
Попробуйте подключить SignalTap анализатор и посмотреть им может быть не по тем адресам записывается.
Еще посмотрите, может к вам чужие прервания приходят, от другого устройства. Правильно ли они обрабатываются?
Можно вообще отключить прерывания и проверить без них на зависания.
Zwerg_nase
Mar 30 2006, 10:02
Подключил SignalTap (см. приаттаченный stp_res.stp). При зависании target (в моём случае это системная память) плохо себя ведёт: заканчивает транзакцию, поднимая в "1" TRDYN, а DEVSELN оставляет в "0", STOPN остаётся в "1". Альтеровская корка считает, что фаза данных всё еще продолжается и она остаётся в ней навсегда. Из альтеры мне написали, что "The target’s abnormal behavior in your environment violates the PCI specification. Master(PCI core) must wait for the target(system memory) to deassert devseln or assert stopn to terminate current transaction according to the PCI specification. So there’s no means to terminate the transaction from local side of PCI core."
Однако, когда я увеличиваю паузу между своими пакетными передачами, зависание прекращается. Скорость передачи при этом правда заметно снижается. Удалось получить где-то 15 МБайт/с на 33 МГц 32 бита.
А компьютер навсегда зависает в ситуации на STP? Просто у меня тоже были подобные когда тестировал PCI. Правда комп при этом не вис. Однако в подобных случаях, pci все-таки прочухивался и мог выдавать разрешение через ~8000 тактов!!! При этом внутренный буфер у меня переполнялся. Такие эффекты могут возникать, если CPU начинает очень активно работать с памятью. Например RightMark Memory Analyzer.
У вас не показан сигнал stop, он не устанавливается при зависании?
Для увеличения производительности попробуйте передавать по 32слова за раз. Тогда и скорость увеличится и задержки.
Zwerg_nase
Apr 5 2006, 05:28
STOPn остаётся в "1" (см. stp_res2.stp).
Да, сейчас пробую менять размер пакетов и длительность паузы между ними.
CPU с памятью работает как обычно.
Вообще, могу добиться, чтобы комп не зависал: для этого надо отключить сетевую плату. Но обмен по PCI на моей плате всё равно умирает, как показано в *.stp.
Со включённой сетевой платой комп зависает намертво, приходится выключать питание.
Ещё, скорость обмена, при которой зависает обмен, зависит от чипсета материнской платы. На некоторых платах удаётся разогнать PCI побыстрее.
Даже не знаю что тут сказать. Как-будто виноват чипсет, мастер действительно должен дождаться ответа таргета. Но это конечно странно как-то.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.