KA3AKOB
Пользователь
Сообщений: 55
|
|
« : 28 Декабрь, 2017, 17:08:59 » |
|
Собрана этажерка из плат фирмы Fastwel: CPC30402 + DIC310 с загруженной в FPGA прошивкой. Нужно написать QNX resource manager под эту прошивку. Возник ряд вопросов: 1)Векторов прерываний, вообще говоря, мало. В методическом руководстве описывается программа обработчик прерывания под систему MS-DOS (FDOS). В ней при инициализации новой программы обработки прерываний старый указатель из вектора, на какой бы обработчик он не указывал, сохраняется, новый вектор содержит указатель на новый обработчик, а в новом обработчике после выполнения своих дел, вызывается старый обработчик по сохранённому указателю. Таким образом, на один вектор прерывания вешается несколько устройств. Но это в DOS. Как это делается в QNX? 2) Как извлечь старый указатель из вектора? С помощью какой функции? 3) В каком потоке менеджера ресурсов работает обработчик прерывания, если в менеджере (драйвере) таких потоков несколько? В том потоке, который издал вызов InterruptAttach()? 4) IRQ5, рекомендуемый в методическом примере DOS, в реальной системе QNX, судя по описанию, используется сетевым адаптером. Сеть отрубать не следует. Как совместить своё устройство со стандартным сетевым адаптером? 5) Прежний обработчик прерывания наверняка находится за пределами адресного пространства моего драйвера (менеджера ресурсов), как избежать Access Violation? Или вызов функции InterruptAttach избавляет разработчика от забот и сам сохраняет прежний указатель из вектора и сам вызывает прежний обработчик прерывания? В книжке Кртена пример не содержит ни сохранения прежнего указателя из вектора IRQ5, ни вызова прежнего из нового обработчика. 6) В примере для DOS сброс прерывания выполняется выдачей команды outportb(0x20, 0x20). Нужно ли выполнять эту команду в QNX? 7) Глядя в осциллоскоп, на взвод сигнала прерывания и его сброс с удивлением обнаружил, что запросы прерываний чаще, чем через 300 миллисекунд обрабатываются не все. То есть сброс прерывания из моего обработчика происходит через очень большой интервал времени. Это время значительно превышает период передиспетчеризации в системе QNX, по моим сведениям: стандартно 4 миллисекунды. Такое наводит на подозрения, что при обработке прерывания тоже произошла передиспетчеризация потоков в системе. Но в Кртене говорится, что если использовал InterruptAttach(), а не InterruptAttachEvent(), то передиспетчеризации не происходит, правда, тогда в обработчике прерывания нельзя делать вызовы системных функций, кроме крайне ограниченного числа оных. Я и не делаю, вызываю только in8(), out8(). Буквально несколько строк. Почему же так долго отзывается? 8 ) Опять же, в DOSовском примере при завершении программы восстанавливается старый указатель на обработчик прерывания. Но завершить драйвер QNX, можно только через kill -9 nnn, а этот сигнал не перехватывается пользователем. Система что-то совершает волшебным образом и процесс исчезает. Но для восстановления старого указателя в векторе и ещё кое-каких завершающих действий с прошивкой, мне надо, чтобы по перехвату сигнала отработал мой завершающий модуль. 9 ) Не может ли железо сетевого адаптера как-то тормозить мой драйвер?
Вопросов много, но ответы нужны. С уважением, Казаков С.А.
|