Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сторожевой таймер в Nios II и шина Avalon
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Acvarif
Имеется проект в котором скомпонованы логический модуль и система на Nios. Связь из Nios с модулем (туда и обрптно) через шину Avalon. Программа для Nios имеет 3 прерывания. 1 - внешнее из логического модуля и 2 прерывания по UART. Все работает неплохо. Но бывает ситуация когда как-будто шина Avalon полностью отключается от логического модуля. Модуль становится неуправляемый. Никакие программные ухищрения не помогают. Только перезагрузка .elf файла и новый запуск программы. При этом .sof перезагружать не требуется. Конфигурация в норме. Можно-ли непосредственно из программы осуществить принудительный сброс процессора Nios с перезапуском программы? Можно-ли в программе Nios организовать, что-то вроде сторожевого таймера для перезапуска Nios и .elf?
alexadmin
Цитата(Acvarif @ Jan 12 2017, 17:21) *
Можно-ли непосредственно из программы осуществить принудительный сброс процессора Nios с перезапуском программы? Можно-ли в программе Nios организовать, что-то вроде сторожевого таймера для перезапуска Nios и .elf?


Если "из программы", то нужно передать управление на точку входа в вашу программу, т.е. по адресу 0 в памяти программ (для стандартной конфигурации). Но это вряд ли надежно. У библиотечного таймера альтеровского есть специальный watchdog режим, формирующий сигнал сброса для всей системы. Но все равно это будет работать только если программа в памяти не повреждена. Если вследствии неправильной работы она сама себя затирает - не спасет. Хотя правильнее все же найти где баг wink.gif
Stewart Little
Цитата(Acvarif @ Jan 12 2017, 17:21) *
Имеется проект в котором скомпонованы логический модуль и система на Nios.

Что-то я не понял, у Вас из Qsys-системы наружу торчит Avalon?
Если так, то это ужас!!!
Опишите Ваш "логический модуль" как компонент Qsys-системы и подключите его к Авалону внутри системы.
Acvarif
Цитата(Stewart Little @ Jan 12 2017, 18:59) *
Что-то я не понял, у Вас из Qsys-системы наружу торчит Avalon?
Если так, то это ужас!!!
Опишите Ваш "логический модуль" как компонент Qsys-системы и подключите его к Авалону внутри системы.

Нет. Модуль подлючен внутри (amulet_0) Нажмите для просмотра прикрепленного файла
Цитата
Если вследствии неправильной работы она сама себя затирает - не спасет. Хотя правильнее все же найти где баг

Программа работает. Проврено. Основной цикл крутится. Прерывания UART работают. Думаю перезапуск системы таймером должен помочь.
Дело в том, что при полной перезагрузке .elf по jtag осуществляется еще и сброс процессора. Будет-ли таймер выполнять и эту операцию?
Raven
Эти зависания - не результат ли это шалостей VIC'а, который на кой-то ляд еще и мастером на Avalon'е може выступать? Да еще с доступом к EPCS Controller'у, из которого, как я вижу, еще и инструкции NIOS'а могут вычитываться. Нельзя ли перепровериться на системе без него? Или, на худой конец, собрать системку без пересечений (например, код NIOS брать пока из onchip RAM, и других пересечений VIC с остальными устройствами чтобы не было).
Acvarif
Цитата(Raven @ Jan 12 2017, 20:05) *
Эти зависания - не результат ли это шалостей VIC'а, который на кой-то ляд еще и мастером на Avalon'е може выступать? Да еще с доступом к EPCS Controller'у, из которого, как я вижу, еще и инструкции NIOS'а могут вычитываться. Нельзя ли перепровериться на системе без него? Или, на худой конец, собрать системку без пересечений (например, код NIOS брать пока из onchip RAM, и других пересечений VIC с остальными устройствами чтобы не было).

Скорее всего VIC работает неплохо. Во всяком случае внешние прерывания не зависают никогда.
Хотя.. Нужно попробовать систему без VIC..

Проверил без VIC. Все то же самое. Застревает. Нужен перезапуск .elf со сбросом. Подлючил таймер в режиме Watchdog (1 сек). Читаю док. по таймеру. Не врубаюсь.
Цитата
A watchdog timer “wakes up” (comes out of reset) stopped. Software can
start the Timer at any time by writing a 1 to the
control
register’s
start
bit. Once started, the Timer can never be stopped. The Timer generates a
pulse on its
reset_out
output when the internal count reaches zero.

После установки бита start он должен запуститься и
будет работать непрерывно. Сбросит он систему когда досчитает до нуля. Что нужно делать, чтобы он не досчитывал до 0. Пишут что нужно перезаписывать ркгистр периода. Может кто сталкивался, как это выглядит в коде попроще без typedef volatile struct и na_timer1->np_timerperiodl.
Acvarif
Ну сторожевой таймер работает. Неплохо.
Код:
До главного цикла при инициализации всего и вся таймер в остановленном состоянии
Код
IOWR(TIMER_0_BASE, 1, 0x0000);

В железно работающем месте программы счетчик типа
Код
        WochDogCount++;
        if(WochDogCount > 3) WochDogSt = 1;

В том месте где все застревает
Код
WochDogCount = 0;
WochDogSt = 0;
В основном цикле программы
Код
...
        if(WochDogSt)
        {
            // пуск сторожевго таймера
            IOWR(TIMER_0_BASE, 1, 0x0004);

            WochDogSt = 0;
            WochDogCount = 0;
...


Raven
Что ж, надо SignalTAP подключать, и смотреть, что происходит в окрестностях подвисания, и в чем это подвисание выражается.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.