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

 
 
 
Reply to this topicStart new topic
> Прерывание функции
djhall
сообщение Aug 3 2014, 11:41
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 29-04-06
Пользователь №: 16 608



Например, выполняется программа и вдруг зависает при выполнении какой-либо функции не важно по каким причинам.
Есть ли возможность аварийно завершить эту функцию и продолжить работу процессора? Своего рода Ctrl-Alt-Del для Nios.
Go to the top of the page
 
+Quote Post
barabek
сообщение Aug 3 2014, 13:51
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(djhall @ Aug 3 2014, 22:41) *
Своего рода Ctrl-Alt-Del для Nios.

ресет.
Но только это не Ctrl-Alt-Del. Да и вообще это разные сущности - Ctrl-Alt-Del это относится к операционной системе, а не к процессору. А если у вас функция зависла - переписать функцию, с возможностью ее прерывания. В общем опишите проблему.
Go to the top of the page
 
+Quote Post
djhall
сообщение Aug 4 2014, 13:22
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 29-04-06
Пользователь №: 16 608



Например, зависла функция работы в режиме прямого доступа к памяти, программа ожидает подтверждение завершения получения данных, а подтверждения нет. Понятно можно сделать таймер и по завершению его работы, завершить работу DMA и выйти из функции.
Можно ли вместо этого сделать прерывание по окончании таймера, в прерывании остановить DMA и затем востановить контекст из стека и таким образом выйти из функции? (звучит как бред конечно)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 4 2014, 15:25
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

Так же возможно и другие варианты sm.gif
Go to the top of the page
 
+Quote Post
Dmitriyspb
сообщение Aug 5 2014, 08:30
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498



Поддерживаю идею watchdog! Нормальное решение.


--------------------
Победа - это когда N раз упал и N+1 раз встал.
Go to the top of the page
 
+Quote Post
djhall
сообщение Aug 5 2014, 10:20
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 29-04-06
Пользователь №: 16 608



Цитата
Все так и надо, можно сделать аналог вочьдога на таймере, а по прерыванию таймера определять откуда в него ввалились, и корректно завершать задачи

Правильно ли я понял, что нужно в прерывании выставить какую-нибудь переменную в 1 и по возвращеении из прерывания проверить условие и если переменная установленна в 1 то завершить функцию? Если так, то я имел ввиду не это.
Я имел ввиду следующее: при заходе в функцию контекст в том числе и место возвращения сохраняются в стек, можно ли в прерывании востановить контекст и продолжить выполнение так как будто программа вообще не заходила в функцию?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 5 2014, 11:27
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



конечно, операционки так задачи переключают.

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

Отслеживание контекста более сложная задача, но тоже реальная. Другое дело надо будет иметь карту всех функций, чтобы по счетчику понимать из какой функции вы суда попали, но тоже решаемо...

Go to the top of the page
 
+Quote Post
djhall
сообщение Aug 5 2014, 16:28
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 29-04-06
Пользователь №: 16 608



Цитата
конечно, операционки так задачи переключают.


А подскажите, чтобы такое почитать и посмотреть, чтобы освоить такое программирование - потому-что пока я даже не представляю с чего начать.
Работаю с NIOS.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 5 2014, 19:09
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



фиг знает... это обычно в архитектуре описывают, потому надо наверное читать про архитектуру НИОСа.

Общий смысл такой, что при входе в прерывание у вас должен быть известен счетчик команд (чтобы вернуться из прерывания) счетчик команд - это указание на код из которого вы прилетели в прерывание. Если взять карту размещения функций в памяти у вас будут адреса начала и конца каждой функции, тот диапазон куда попал счетчик команд из той функции вас и дернули.

Чтобы в нее вернутся достаточно в счетчик команд загрузить это сохраненное значение, и программа пойдет дальше так как будто ее не прерывали. Только в разных архитектурах есть бонусы,в АРМ надо восстановить еще 5 регистров, и задать режим работы. Процедуру входа и выхода из прерывания надо читать в описании проца, сделать как написано и все...
Go to the top of the page
 
+Quote Post

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

 


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


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