Страниц: [1]
  Печать  
Автор Тема: Запускаем платы CAN под QNX.  (Прочитано 1686 раз)
da-nie
Full Member
***
Offline Offline

Сообщений: 222



Просмотр профиля
« : Апреля 06, 2019, 05:45:08 pm »

Запустил под QNX плату CAN Adlink PCI-7841. Может быть, кому-нибудь пригодится.
Программа для работы с платой PCI-7841 (репозиторий будет обновляться).

За основу взят драйвер для Linux. Все магические числа успешно сохранены (я всё равно не в курсе, что большая часть из них значит).
Как драйвер оформлять не стал - лет 15 назад я такую глупость сделал для платы CAN527D (драйвер физического CAN->драйвер виртуального CAN (чтобы много устройств работало одновременно с одним CAN)->драйвер работы с устройством->основная программа) и наелся с задержками (у меня счёт на части миллисекунды идёт - относительно плотный обмен) и необходимостью следить за соединением с драйвером (вдруг он уже упал).

В данный момент осталось понять, как детектировать Buss-off и что после него сделать для восстановления канала (на CAN527D я полностью переинициализирую канал).
« Последнее редактирование: Апреля 06, 2019, 05:47:06 pm от da-nie » Записан

И день и ночь в пути
da-nie
Full Member
***
Offline Offline

Сообщений: 222



Просмотр профиля
« Ответ #1 : Апреля 22, 2019, 08:01:59 pm »

Вот ещё программа для работы с платой CAN527D. Так же как драйвер не оформлялась.
Записан

И день и ночь в пути
da-nie
Full Member
***
Offline Offline

Сообщений: 222



Просмотр профиля
« Ответ #2 : Июля 31, 2019, 08:02:09 pm »

Странно. Сегодня попался компьютер (на i3), на котором программа для pci7841 весело зависает намертво вместе с системой при завершении программы по сигналу или при вызове функции Init повторно. Ни на одном другом компьютере такого не было никогда! В попытках понять, что происходит, удалось обнаружить, что зависание возникает при вызове функции StopThread. Но вся штука в том, что зависает захват мютекса в классе RAII для работы с мютексом. Я в полном недоумении. Sad Если пропустить настройку каналов в инициализации, то зависания не происходит. Что от этого меняется-то?  Angry Прерывания не приходят? Но я полностью отключал поток обработки прерываний (вместе с InterruptAttachEvent) - зависает также на ура. И главное, я не понимаю, чем занимается в это время процессор. Такое впечатление, что система застревает в каком-то своём ISR (моего-то нет - InterruptAttachEvent), откуда не выходит. Странно ещё и то, что если убрать InterruptUnmask, то намертво отваливается USB-клавиатура, но мышка PS/2 живёт, как и вся остальная система. Уж не поделила ли QNX линию прерывания платы PCI7841 с другими устройствами и что-то работает неверно, вот и виснет?  Roll Eyes
Записан

И день и ночь в пути
da-nie
Full Member
***
Offline Offline

Сообщений: 222



Просмотр профиля
« Ответ #3 : Августа 01, 2019, 06:47:13 pm »

Интересная штука. Оказывается, всё дело в этих самых прерываниях. Плате обязательно нужно их запретить до завершения работы с ней и шиной PCI. Похоже, если у неё не сбросить флаг прерывания, считав регистр прерываний, она начинает генерировать прерывания непрерывно, чем загоняет QNX до зависания. А не натыкался я на такое, потому что система работала как запрос-ответ и сама формировала запрос. Как только я стал ловить приходящий траффик, тут всё и повисало намертво.
Записан

И день и ночь в пути
Страниц: [1]
  Печать  
 
Перейти в: