реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Сторожевой таймер в Nios II и шина Avalon
Acvarif
сообщение Jan 12 2017, 14:21
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Имеется проект в котором скомпонованы логический модуль и система на Nios. Связь из Nios с модулем (туда и обрптно) через шину Avalon. Программа для Nios имеет 3 прерывания. 1 - внешнее из логического модуля и 2 прерывания по UART. Все работает неплохо. Но бывает ситуация когда как-будто шина Avalon полностью отключается от логического модуля. Модуль становится неуправляемый. Никакие программные ухищрения не помогают. Только перезагрузка .elf файла и новый запуск программы. При этом .sof перезагружать не требуется. Конфигурация в норме. Можно-ли непосредственно из программы осуществить принудительный сброс процессора Nios с перезапуском программы? Можно-ли в программе Nios организовать, что-то вроде сторожевого таймера для перезапуска Nios и .elf?
Go to the top of the page
 
+Quote Post
alexadmin
сообщение Jan 12 2017, 14:34
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 572
Регистрация: 17-11-05
Из: СПб, Россия
Пользователь №: 10 965



Цитата(Acvarif @ Jan 12 2017, 17:21) *
Можно-ли непосредственно из программы осуществить принудительный сброс процессора Nios с перезапуском программы? Можно-ли в программе Nios организовать, что-то вроде сторожевого таймера для перезапуска Nios и .elf?


Если "из программы", то нужно передать управление на точку входа в вашу программу, т.е. по адресу 0 в памяти программ (для стандартной конфигурации). Но это вряд ли надежно. У библиотечного таймера альтеровского есть специальный watchdog режим, формирующий сигнал сброса для всей системы. Но все равно это будет работать только если программа в памяти не повреждена. Если вследствии неправильной работы она сама себя затирает - не спасет. Хотя правильнее все же найти где баг wink.gif
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение Jan 12 2017, 14:59
Сообщение #3


Лентяй
******

Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843



Цитата(Acvarif @ Jan 12 2017, 17:21) *
Имеется проект в котором скомпонованы логический модуль и система на Nios.

Что-то я не понял, у Вас из Qsys-системы наружу торчит Avalon?
Если так, то это ужас!!!
Опишите Ваш "логический модуль" как компонент Qsys-системы и подключите его к Авалону внутри системы.


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 12 2017, 15:39
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



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

Нет. Модуль подлючен внутри (amulet_0)
Прикрепленное изображение

Цитата
Если вследствии неправильной работы она сама себя затирает - не спасет. Хотя правильнее все же найти где баг

Программа работает. Проврено. Основной цикл крутится. Прерывания UART работают. Думаю перезапуск системы таймером должен помочь.
Дело в том, что при полной перезагрузке .elf по jtag осуществляется еще и сброс процессора. Будет-ли таймер выполнять и эту операцию?

Сообщение отредактировал Acvarif - Jan 12 2017, 15:42
Go to the top of the page
 
+Quote Post
Raven
сообщение Jan 12 2017, 16:05
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 491
Регистрация: 16-01-05
Из: Санкт-Петербург
Пользователь №: 1 987



Эти зависания - не результат ли это шалостей VIC'а, который на кой-то ляд еще и мастером на Avalon'е може выступать? Да еще с доступом к EPCS Controller'у, из которого, как я вижу, еще и инструкции NIOS'а могут вычитываться. Нельзя ли перепровериться на системе без него? Или, на худой конец, собрать системку без пересечений (например, код NIOS брать пока из onchip RAM, и других пересечений VIC с остальными устройствами чтобы не было).
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 12 2017, 16:57
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(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.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 12 2017, 18:51
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Ну сторожевой таймер работает. Неплохо.
Код:
До главного цикла при инициализации всего и вся таймер в остановленном состоянии
Код
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;
...


Go to the top of the page
 
+Quote Post
Raven
сообщение Jan 13 2017, 15:40
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 491
Регистрация: 16-01-05
Из: Санкт-Петербург
Пользователь №: 1 987



Что ж, надо SignalTAP подключать, и смотреть, что происходит в окрестностях подвисания, и в чем это подвисание выражается.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016