QNX.ORG.RU
*
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: IRC канал проекта - #qor на irc.freenode.net (кодировка koi8-r)
 
   Начало   Wiki Помощь Поиск Войти Регистрация  
Страниц: [1] 2
  Печать  
Автор Тема: Ловля превываний  (Прочитано 687 раз)
drifter
Участник
*
Offline Offline

Сообщений: 31


Просмотр профиля
« : Июля 23, 2010, 05:56:37 pm »

Код в приложении, не могу понять почему не работает обработка прерываний. На QNX 6.2 на ISA шине все работало, а теперь на 6.4 нет.
статусный регистр платы пишет что прерывание есть, а обработчик не срабатывает.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 269


Просмотр профиля WWW
« Ответ #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
Jr. Member
**
Offline Offline

Сообщений: 79


Просмотр профиля
« Ответ #2 : Июля 24, 2010, 02:30:20 pm »

2 drifter
Так это что выходить? Ваша плата ISA-шная?
А Вы про неё топик "общение с PCI платами" открыли.
Записан

пьяный за комп не садиться (себя памятка)
drifter
Участник
*
Offline 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
QOR.Moderator
*****
Offline Offline

Сообщений: 269


Просмотр профиля WWW
« Ответ #4 : Июля 27, 2010, 06:52:26 am »

нет, написание обработчика прерываний не отличается. но для того, чтобы все работало требуется корректная работа и инициализация вашей платы ацп. комментарии ваши к сожалению на моей системе нечитабельные, да и кто кроме вас будет разбираться... мне странно, что вы базовый адрес берете из bar[2], например. никакого другого потока с таймером я тоже не вижу, да и не делают так, по хорошему.
вот все, что требуется прочитать для понимания специфики ос
http://www.qnx.com/developers/docs/6.4.1/neutrino/prog/inthandler.html
http://www.qnx.com/developers/articles/article_304_2.html


Записан
drifter
Участник
*
Offline Offline

Сообщений: 31


Просмотр профиля
« Ответ #5 : Июля 27, 2010, 01:18:09 pm »

Вот, написал как в примерах.
Данные с канала АЦП читаются если крутить потенциометр данные во втором столбце меняются (в output скопировал вывод в терминал).
Но прерывания не ловятся.
Первый столбец - статусный регистр говорит о том что плата прерывание по концу преобразования дает...
Хрень какаято
Записан
drifter
Участник
*
Offline Offline

Сообщений: 31


Просмотр профиля
« Ответ #6 : Июля 29, 2010, 06:46:21 pm »

Кстати у меня на одном прерывании с платой висит еще какой-то usb котроллер (при загрузке посмотрел). Это влияет на работу обработчика прерываний?
Записан
drifter
Участник
*
Offline 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
Jr. Member
**
Offline Offline

Сообщений: 98


Просмотр профиля
« Ответ #8 : Августа 10, 2010, 01:51:40 pm »

Я так понял, что драйвер usb ловит мое прерывание и драйвер платы не срабатывает. (хотя это тока домыслы). Как в QNX отключить драйвер usb и usb впринципе. не нужно оно мне.

slay io-usb
Чтобы посмотреть кто использует какие прерывания:
pidin irqs

Разделять PCI-е прерывания нежелательно, но вполне допустимо. Т.е. дело явно не в этом.

SMBus - это практически интерфейс I2C, используемый обычно для мониторинга температуры платы и т.п.
Записан
drifter
Участник
*
Offline Offline

Сообщений: 31


Просмотр профиля
« Ответ #9 : Августа 10, 2010, 03:48:38 pm »

при вызове pidin irqs написано что мой процесс привязан к прерыванию 0xa. Один из usb драйверов тоже к 0xa. При вызове pci -vvv написано что моя плата посажена на линию 0xa. Читаю статусный регистр платы - говорит есть прерывание.
Если меняю в interruptAttach номер прерывания с 0xa на 1 - ловит с клаиватуры без проблем.
А на плату не реагирует.... то ли лыжи не едут.....
Записан
aluv
Jr. Member
**
Offline Offline

Сообщений: 98


Просмотр профиля
« Ответ #10 : Августа 10, 2010, 04:12:55 pm »

Советы:
1) Посмотреть осциллографом линию прерываний на плате, т.е. физически прерывания должны быть.
2) Убедиться в том, что плата инициализируется корректно.

На случай кривого PCI BIOS:
3) Попробовать на другой мат. плате с другим BIOS.
4) Попробовать повесить этот обработчик прерываний на другие прерывания (лучше перепробовать все).
5) Проинициализировать самостоятельно контроллер прерываний для вашего 0xA (по уровню).
Записан
-Al-
Jr. Member
**
Offline Offline

Сообщений: 50


Просмотр профиля
« Ответ #11 : Августа 10, 2010, 05:51:18 pm »

...Разделять PCI-е прерывания нежелательно, но вполне допустимо...
Я бы всетаки сказал просто, что вполне допустимо без каких либо проблем. Если конечно обработчики прерываний для всех устройств, что висят на одном прерывании, нормально написаны.
Записан
-Al-
Jr. Member
**
Offline Offline

Сообщений: 50


Просмотр профиля
« Ответ #12 : Августа 10, 2010, 05:52:22 pm »

при вызове pidin irqs написано что мой процесс привязан к прерыванию 0xa. Один из usb драйверов тоже к 0xa. При вызове pci -vvv написано что моя плата посажена на линию 0xa. Читаю статусный регистр платы - говорит есть прерывание.
Если меняю в interruptAttach номер прерывания с 0xa на 1 - ловит с клаиватуры без проблем.
А на плату не реагирует.... то ли лыжи не едут.....
А Вы уверены, сто Вы разрешаете прерывания на самой плате??
Записан
drifter
Участник
*
Offline Offline

Сообщений: 31


Просмотр профиля
« Ответ #13 : Августа 10, 2010, 07:03:52 pm »

Я уже ни в чем не уверен.
Но на плате есть управляющий регистр куда нужно записать разрешение на прерывание. Записал. И есть статусный регистр, говорящий о появлении прерывания. Если его не разрешать то оно и не появляется (как говорит статусный регистр).
Может где-то еще нужно разрешить прерывания.....

А как посмотреть линию прерывания на плате? Будет напряжение на одной из ножек платы? Можно узнать на какой?
Записан
-Al-
Jr. Member
**
Offline Offline

Сообщений: 50


Просмотр профиля
« Ответ #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- » Записан
Страниц: [1] 2
  Печать  
 
Перейти в:  

Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC