Официальный форум СВД Встраиваемые Системы
05 Декабря, 2016, 19:34:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема при перезагрузке прикладных программ  (Прочитано 1294 раз)
LH
Опытный пользователь

Сообщений: 251


« : 07 Июля, 2013, 07:33:52 »

Имеется несколько проектов измерительных систем в QNX4.25, работающих на контроллерах с промышленными
процессорными платами ADVANTECH PCA-**** с процессорами Pentium-III, Pentium-IV и более современными
моделями вроде PCA-6149.

Измерения выполняются разными устройствами ввода-вывода и обслуживаются прикладными
программами в QNX4, написанными самостоятельно и оформленными не в виде драйверов,
а в виде обычных программ, обменивающихся сообщениями. Программы используют аппаратные прерывания
устройств в/в.

Периодически ( не часто ) возникает проблема при т.н. "перезагрузке" проекта, когда выполняется
скрипт по снятию программ с исполнения и скрипт по запуску программ на исполнение.

Снятие программ:
...
slay -f prog1
slay -f prog2
...

Cтарт программ:
...
prog1 &
prog 2 &
...

Проблема заключается в полной блокировке контроллера ( остановке ОС ).
Характерно, что после нажатия кнопки Reset ( горячего рестарта ) контроллера
BIOS начинает работу , проходит выполнение проверки памяти, но на стадии обнаружения дисковых
устройств BIOS останавливает свою работу и загрузки ОС не происходит.

Помогает только отключение питания процессорной платы ( холодный рестарт ).

В чем могут быть ошибки и проблемы?

Спасибо.




Записан
Al
Пользователь

Сообщений: 87


« Ответ #1 : 08 Июля, 2013, 13:40:58 »

Судя по описанию проблемы, первое, что приходит в голову, это ваши платы, после завершения программ продолжают выдавать прерывания.
Записан

Василий Дмитриев
Опытный пользователь

Сообщений: 293



« Ответ #2 : 10 Июля, 2013, 06:23:50 »

Налицо не остановка ОС, а полная хрень с инициализацией железа, ибо биос тоже виснет. Посему,
1. На какой шине сидят ваши платы?
2. Какие прерывания и адреса используют?
3. Есть ли прерывания используемые совместно со стандартным железом?
И это только для начала разговора.
Еще не худо бы выложить вывод sin irq в рабочем состоянии
Если платы на pci, то show_pci -v в студию.
Записан

Санкции! Запрещаю Бараку Обаме и членам конгресса США читать мои посты!
LH
Опытный пользователь

Сообщений: 251


« Ответ #3 : 15 Июля, 2013, 16:37:52 »

1.Прикладные программы m_analog обслуживают 3 платы АЦП PCI-1713 (шина PCI ) c векторами прерываний 5, 11, 11.
2.Адреса платам выделяет контроллер шины PCI.
3.Прерывания используются совместно с сетевыми платами (Net), контроллером USB(io-usb) и контроллером ж/дисков(Fsys.atapi).

4.При обслуживании АЦП PCI-1713 каждый раз производится программно старт преобразования АЦП.
режим автоматического запуска преобразований АЦП не применяется.

Записан
Василий Дмитриев
Опытный пользователь

Сообщений: 293



« Ответ #4 : 15 Июля, 2013, 21:17:59 »

Что делает Fsys.atapi на 11-м прерывании? У вас apic отключен? sata в легаси?
Записан

Санкции! Запрещаю Бараку Обаме и членам конгресса США читать мои посты!
Антон Падалко
Пользователь

Сообщений: 34


« Ответ #5 : 16 Июля, 2013, 09:09:10 »

Были и у нас такие же проблемы с платой АЦП PCI-1713.
1. Плата PCI-1713 разделяет прерывание с сетевухой и/или USB контроллером. Если запустить(перезапустить) сетевой драйвер или менеджер io-usb после прикладного ПО, работающего с платой PCI-1713, то плата АЦП переставала генерить прерывания. Добавили в прикладное ПО переинициализацию платы АЦП, при возникновении такой ситуации.
2. Были еще какие-то необъяснимые проблемы с одновременным использованием PCI-1713 и плат расширения последовательных портов (на шине ISA), если порты настроены на использование прерывания больше 9.
3. При горячем рестарте (reset или watchdog) компьютер больше не загружается, поскольку плата АЦП продолжает генерить прерывание.
Проблема проявлялась на системной плате PCA-6010 (и более "свежих"), а на "старой" системной плате PCA-6178 вроде все работало (если мне не изменяет память).

В итоге мы решили проблему так - отказались от использования прерывания в прикладном ПО при работе платой АЦП PCI-1713.
С тех пор никаких проблем  Smiley
Записан
Al
Пользователь

Сообщений: 87


« Ответ #6 : 16 Июля, 2013, 09:14:55 »

В контроллере и PLXе выключаете прерывания и отключаете обработчик по сигналу завершения (SIGKILL) программ??
PS PLX та еще хрень. Я с ней намучался, когда делал дрова для платы. Оказалось, что на некоторых материнках PLX в упор игнорирует обращения через PCI Base Address 1 for I/O Mapped Configuration Registers. Решил проблему через PCI Base Address 0 for Memory Mapped Configuration Registers
« Последнее редактирование: 16 Июля, 2013, 09:19:08 от Al » Записан

LH
Опытный пользователь

Сообщений: 251


« Ответ #7 : 16 Июля, 2013, 19:00:32 »

APIC не отключен в BIOS.
Какие неприятности может нести не отключенный APIC, если QNX4 его не поддерживает ( кроме задержек ) ?

SATA в режиме AUTO. Другие возможные варианты Combined, Enhansed, SATA Only.
Что здесь может быть не так?

При запуске преобразований в PCI-1713 в base+6 записываю 0x11 что означает:
- разрешение аппаратного прерывания;
- разрешение прерывания от программного старта АЦП и запрет всех других источников прерывания.

SIGKILL вроде как программой не перехватывается.

Планирую по SIGTERM делать:
outp( base+6, 0 );   //Запрертить аппаратное прерывание и любые источники прерывания
qnx_hint_detach();

Пожалуйста поясните: обязана ли прикладная программа, использующая аппаратные прерывания устройства,
_всегда_ перехватывать сигнал SIGTERM при своем завершении и отсоединять обработчик прерывания?

Я считал, что при снятии процесса с исполнения ОС QNX4 самостоятельно отсоединяет обработчик прерывания
удаляемого процесса.

В моем случае устройство PCI-1713 программно запускает преобразование АЦП, после завершения которого происходит
прерывание. Каким образом устройство может перейти в режим непрерывной генерации прерываний, если выполнен запрет аппаратных
прерываний от внутреннего источника ( встроенного таймера ) и внешнего источника?

спасибо.
« Последнее редактирование: 17 Июля, 2013, 03:21:43 от LH » Записан
Антон Падалко
Пользователь

Сообщений: 34


« Ответ #8 : 17 Июля, 2013, 09:05:01 »

SIGKILL вроде как программой не перехватывается.
Планирую по SIGTERM делать:
outp( base+6, 0 );   //Запрертить аппаратное прерывание и любые источники прерывания
qnx_hint_detach();
Да, я так и делал, когда использовал прерывание при работе с платой PCI-1713 (перехватывал сигналы SIGTERM, SIGKILL, SIGPWR)
Кстати, для возможности перехвата SIGKILL необходимо выставить флаг у процесса:
Код:
qnx_pflags(~0,_PPF_IMMORTAL,0,0);
В большинстве случаев это помогало, но при нажатии кнопки reset или срабатывании watchdog компьютер наглухо зависал при загрузке Smiley, поэтому от использования прерывания я отказался.

На остальные ваши вопросы ответа не знаю, поскольку с программным запуском АЦП не работал.
У нас большая частота измерений, поэтому я использую запуск оцифровки по встроенному таймеру платы.
Исходя из заданной частоты оцифровки, я знаю время за которое заполнится половина буфера FIFO.
Далее создаю программный таймер и с этим периодом вычитываю буфер FIFO (а ранее читал по прерыванию).
Записан
Василий Дмитриев
Опытный пользователь

Сообщений: 293



« Ответ #9 : 18 Июля, 2013, 07:57:12 »

APIC не отключен в BIOS.
Какие неприятности может нести не отключенный APIC, если QNX4 его не поддерживает ( кроме задержек ) ?

SATA в режиме AUTO. Другие возможные варианты Combined, Enhansed, SATA Only.
Что здесь может быть не так?
APIC - назначение биосом устройству прерываний, которые не обрабатываются осью, не поддерживающей APIC
Я сильно подозреваю что на самом деле картинка, показанная sin irq не очень корректна. Может имеет смысл загрузить например qnx6 и посмотреть прерывания оттуда.
SATA я бы поставил в combined, чисто по опыту:)
Записан

Санкции! Запрещаю Бараку Обаме и членам конгресса США читать мои посты!
LH
Опытный пользователь

Сообщений: 251


« Ответ #10 : 22 Июля, 2013, 16:59:48 »

Спасибо padanser за интересный опыт работы с PCI-1713.

Так каков Ваш вывод: "кривая" плата или неправильная программа?

Если возможно, интересно было бы взглянуть на Ваш вариант работы с PCI-1713 через FIFO. Спасибо.
Записан
LH
Опытный пользователь

Сообщений: 251


« Ответ #11 : 24 Июля, 2013, 17:43:25 »

Несколько раз проявилась еще одна проблема ( фото прилагаю ).

Особенность: посмертный дамп наблюдался только при "холодном" включении контроллера,
из состояния выключен.

При "горячей" перезагрузке контроллера проблема "смерти" QNX4 при включении
графического драйвера Pg.i830 ни разу не возникала.

Буду признателен за комментарии и советы.
Записан
Антон Падалко
Пользователь

Сообщений: 34


« Ответ #12 : 27 Июля, 2013, 22:51:17 »

Спасибо padanser за интересный опыт работы с PCI-1713.
Так каков Ваш вывод: "кривая" плата или неправильная программа?
Если возможно, интересно было бы взглянуть на Ваш вариант работы с PCI-1713 через FIFO. Спасибо.
Мой вывод - "кривая" плата, но если не использовать прерывание, то с ней вполне можно дружить Smiley
Мой вариант работы:
1. Настраиваем внутренний таймер на необходимую частоту оцифровки (регистры управления таймером base+30, base+26, base+28)
2. Настраиваем необходимый диапазон каналов измерения (регистр base+2)
3. Очищаем буфер FIFO (запись любого значения в регистр base+9)
3. Запускаем оцифровку от внутреннего таймера платы (запись значения 0x02 в регистр base+6)
4. Усё, плата будет сама с заданной частотой оцифровывать заданный диапазон каналов и складывать результаты в буфер FIFO
5. Нам остается только периодически вычитывать результаты оцифровки из буфера FIFO:
Код:
status = inp(base+7);
while( !(status & 0x01) )
{
    data = inpw(base);
    status = inp(base+7);
}
6. Вот здесь возникает вопрос с каким периодом вычитывать результаты из буфера FIFO...
6.1. Плата может генерить прерывание когда буфер FIFO будет заполнен наполовину.
Сначала я так и делал - запускал оцифровку от внутреннего таймера и разрешал генерить прерывание при заполнении половины буфера FIFO (запись значения 0x32 в регистр base+6).
По получении прерывания вычитывал содержимое буфера FIFO. Но с прерыванием есть проблемы, озвученные ранее в этой теме.
6.2. Собственно, зная частоту оцифровки встроенного таймера, легко вычислить время за которое заполнится половина буфера FIFO.
Далее заводим программный таймер на этот период времени, и по его срабатыванию также и вычитываем буфер FIFO.
Сейчас я так и делаю и никаких проблем с прерываниями Smiley
Записан
LH
Опытный пользователь

Сообщений: 251


« Ответ #13 : 28 Июля, 2013, 05:32:46 »

Спасибо за разъяснение.

Для моего случая есть существенное отличие: диапазон каналов измерения для разных каналов
может быть различным.

Т.о. мне нужно накапливать в FIFO несколько измерений по одному каналу, затем переходить к другому каналу
и перестраивать к-т усиления.

 в FIFO достаточно накопить 5-10 измерений по одному каналу. Это не более 100 микросекунд.

Для qnx4 , если ticksize 0.5 , минимальное время ожидания 500 микросекунд...

Возвращаться к простому зацикливанию на регистре состояния и опросу по готовности каждого преобразования
кажется уж совсем некрасивым решением.

Но все же через FIFO это хорошая альтернатива. Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2016 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 28 Ноября, 2016, 17:03:01