drifter
Участник
Offline
Сообщений: 31
|
 |
« : Июля 23, 2010, 05:56:37 pm » |
|
Код в приложении, не могу понять почему не работает обработка прерываний. На QNX 6.2 на ISA шине все работало, а теперь на 6.4 нет. статусный регистр платы пишет что прерывание есть, а обработчик не срабатывает.
|
|
|
|
|
Записан
|
|
|
|
|
ed1k
|
 |
« Ответ #1 : Июля 24, 2010, 05:29:59 am » |
|
"вдруг слышу за собою совы нежные, уй-юй...." (с) Les Pires Да как же оно у вас могло работать? Кто разрешал в обработчике прерывания вызывать printf()? Если хотите печатать прочитайте доку как обрабатывать прерывания с помощью InterruptAttachEvent(). Ну типа дернется ваш обработчик три раза читая результат преобразования ацп и разрешая следующее преобразование, ну а на четвертый раз n_adc<3 не истино и адью. Возможно я не прав, как работает ваша плата ацп вам виднее... А чем вам макро PCI_IO_ADDR() не угодило, что вы вдруг единицу придумали вычитать от адреса? В описании pci_attach_device() есть упоминание этого макроса с примером, что характерно. Потом, делая mmap_device_io() вы говорите, что у вас портов ввода-вывода у устройства всего 2 байта, а потом как ни в чем ни бывало пишете в порт со смещением 0х40. В чем смысл такого обмана операционки? Хорошо, что у вас на х86 все с рук сходит...
|
|
|
|
|
Записан
|
|
|
|
|
@gn
|
 |
« Ответ #2 : Июля 24, 2010, 02:30:20 pm » |
|
2 drifter Так это что выходить? Ваша плата ISA-шная? А Вы про неё топик "общение с PCI платами" открыли.
|
|
|
|
|
Записан
|
пьяный за комп не садиться (себя памятка)
|
|
|
drifter
Участник
Offline
Сообщений: 31
|
 |
« Ответ #3 : Июля 26, 2010, 10:51:43 am » |
|
Нет, плата PCI. Была раньше ISA (да и сейчас есть) и стоит на компе с QNX 6,2 (плата 90 года выпуска... раритет...). С нее все работало и прерывания ловились. В обработчике прерываний printf() это от незнаний, но и без printf ниче не работает. Три раза он делается а потом в потоке с таймером n_acp снова обнуляется. (это в теории, на самом деле он не срабатывает ни разу). Про 2 байта я думал это размер данных.... хорошо что все работало =)
Попробую конкретизировать вопрос... Отличается ли написание обработчика прерываний в 6.2 и 6,4? Т.е. пишем InterruptAttach() с именем функции acp_handle обработчика в теле потока и описываем функцию acp_handle как const struct sigevent* и т.д. (как написано в приложенном в первом посте коде) и все должно работать? Если да то не работает, если нужно еще что-то дописать подскажите что
|
|
|
|
|
Записан
|
|
|
|
|
ed1k
|
 |
« Ответ #4 : Июля 27, 2010, 06:52:26 am » |
|
нет, написание обработчика прерываний не отличается. но для того, чтобы все работало требуется корректная работа и инициализация вашей платы ацп. комментарии ваши к сожалению на моей системе нечитабельные, да и кто кроме вас будет разбираться... мне странно, что вы базовый адрес берете из bar[2], например. никакого другого потока с таймером я тоже не вижу, да и не делают так, по хорошему. вот все, что требуется прочитать для понимания специфики ос http://www.qnx.com/developers/docs/6.4.1/neutrino/prog/inthandler.htmlhttp://www.qnx.com/developers/articles/article_304_2.html
|
|
|
|
|
Записан
|
|
|
|
drifter
Участник
Offline
Сообщений: 31
|
 |
« Ответ #5 : Июля 27, 2010, 01:18:09 pm » |
|
Вот, написал как в примерах. Данные с канала АЦП читаются если крутить потенциометр данные во втором столбце меняются (в output скопировал вывод в терминал). Но прерывания не ловятся. Первый столбец - статусный регистр говорит о том что плата прерывание по концу преобразования дает... Хрень какаято
|
|
|
|
|
Записан
|
|
|
|
drifter
Участник
Offline
Сообщений: 31
|
 |
« Ответ #6 : Июля 29, 2010, 06:46:21 pm » |
|
Кстати у меня на одном прерывании с платой висит еще какой-то usb котроллер (при загрузке посмотрел). Это влияет на работу обработчика прерываний?
|
|
|
|
|
Записан
|
|
|
|
drifter
Участник
Offline
Сообщений: 31
|
 |
« Ответ #7 : Августа 10, 2010, 01:40:49 pm » |
|
Подскажите хоть что-нибудь, уже моск сломался.... Вычитал, что делить прерывания нехорошо. Залез в БИОС отключил все что можно. остались только 3 usb контроллера, видеокарта, хард, SMBus(не знаю что это) и моя карта. Но дать ей собственную линию IRQ не удается, так как IRQ PCI слотов запараллелены. В маме 5 слотов. PCI1 и PCI5 запараллелены изначально, на PCI 1 висит один USB, на PCI 3 и PCI 4 два других, а на PCI 2 - этот самый SMBus. Т.е. в какой слот не вставь плату и какое прерывание ей не назначь, все равно будет висеть на одном IRQ с каким нить из контроллеров USB или SMBus. Я так понял, что драйвер usb ловит мое прерывание и драйвер платы не срабатывает. (хотя это тока домыслы). Как в QNX отключить драйвер usb и usb впринципе. не нужно оно мне.
|
|
|
|
|
Записан
|
|
|
|
|
aluv
|
 |
« Ответ #8 : Августа 10, 2010, 01:51:40 pm » |
|
Я так понял, что драйвер usb ловит мое прерывание и драйвер платы не срабатывает. (хотя это тока домыслы). Как в QNX отключить драйвер usb и usb впринципе. не нужно оно мне.
slay io-usb Чтобы посмотреть кто использует какие прерывания: pidin irqs Разделять PCI-е прерывания нежелательно, но вполне допустимо. Т.е. дело явно не в этом. SMBus - это практически интерфейс I2C, используемый обычно для мониторинга температуры платы и т.п.
|
|
|
|
|
Записан
|
|
|
|
drifter
Участник
Offline
Сообщений: 31
|
 |
« Ответ #9 : Августа 10, 2010, 03:48:38 pm » |
|
при вызове pidin irqs написано что мой процесс привязан к прерыванию 0xa. Один из usb драйверов тоже к 0xa. При вызове pci -vvv написано что моя плата посажена на линию 0xa. Читаю статусный регистр платы - говорит есть прерывание. Если меняю в interruptAttach номер прерывания с 0xa на 1 - ловит с клаиватуры без проблем. А на плату не реагирует.... то ли лыжи не едут.....
|
|
|
|
|
Записан
|
|
|
|
|
aluv
|
 |
« Ответ #10 : Августа 10, 2010, 04:12:55 pm » |
|
Советы: 1) Посмотреть осциллографом линию прерываний на плате, т.е. физически прерывания должны быть. 2) Убедиться в том, что плата инициализируется корректно.
На случай кривого PCI BIOS: 3) Попробовать на другой мат. плате с другим BIOS. 4) Попробовать повесить этот обработчик прерываний на другие прерывания (лучше перепробовать все). 5) Проинициализировать самостоятельно контроллер прерываний для вашего 0xA (по уровню).
|
|
|
|
|
Записан
|
|
|
|
|
-Al-
|
 |
« Ответ #11 : Августа 10, 2010, 05:51:18 pm » |
|
...Разделять PCI-е прерывания нежелательно, но вполне допустимо... Я бы всетаки сказал просто, что вполне допустимо без каких либо проблем. Если конечно обработчики прерываний для всех устройств, что висят на одном прерывании, нормально написаны.
|
|
|
|
|
Записан
|
|
|
|
|
-Al-
|
 |
« Ответ #12 : Августа 10, 2010, 05:52:22 pm » |
|
при вызове pidin irqs написано что мой процесс привязан к прерыванию 0xa. Один из usb драйверов тоже к 0xa. При вызове pci -vvv написано что моя плата посажена на линию 0xa. Читаю статусный регистр платы - говорит есть прерывание. Если меняю в interruptAttach номер прерывания с 0xa на 1 - ловит с клаиватуры без проблем. А на плату не реагирует.... то ли лыжи не едут.....
А Вы уверены, сто Вы разрешаете прерывания на самой плате??
|
|
|
|
|
Записан
|
|
|
|
drifter
Участник
Offline
Сообщений: 31
|
 |
« Ответ #13 : Августа 10, 2010, 07:03:52 pm » |
|
Я уже ни в чем не уверен. Но на плате есть управляющий регистр куда нужно записать разрешение на прерывание. Записал. И есть статусный регистр, говорящий о появлении прерывания. Если его не разрешать то оно и не появляется (как говорит статусный регистр). Может где-то еще нужно разрешить прерывания.....
А как посмотреть линию прерывания на плате? Будет напряжение на одной из ножек платы? Можно узнать на какой?
|
|
|
|
|
Записан
|
|
|
|
|
-Al-
|
 |
« Ответ #14 : Августа 11, 2010, 09:01:52 am » |
|
Я уже ни в чем не уверен. Но на плате есть управляющий регистр куда нужно записать разрешение на прерывание. Записал. И есть статусный регистр, говорящий о появлении прерывания. Если его не разрешать то оно и не появляется (как говорит статусный регистр). Может где-то еще нужно разрешить прерывания.....
А как посмотреть линию прерывания на плате? Будет напряжение на одной из ножек платы? Можно узнать на какой?
При возникновении прерывания уровень, как правило, возникает на контакте INTA-A6 разъема PCI. А вообще определяется конфигурацией в плате (можно узнать по show_pci -vvv, к какому именно контакту в Вашей плате прерывание подходит), поскольку разработчик мог заложить и любое другое: INTB-B7, INTC-A7, INTD-B8. PS Что и где нужно разрешить - это надо хотя-бы видеть описание регистров платы.... PPS И вообще, описание платы не помешало-бы... А то Вдруг там специализированный PCI-контроллер от PLX, а мы тут как бараны сидим и не понимаем, почему прерываний нет...
|
|
|
|
« Последнее редактирование: Августа 11, 2010, 09:21:38 am от -Al- »
|
Записан
|
|
|
|
|