Полная версия этой страницы:
Прерывание функции
Например, выполняется программа и вдруг зависает при выполнении какой-либо функции не важно по каким причинам.
Есть ли возможность аварийно завершить эту функцию и продолжить работу процессора? Своего рода Ctrl-Alt-Del для Nios.
barabek
Aug 3 2014, 13:51
Цитата(djhall @ Aug 3 2014, 22:41)

Своего рода Ctrl-Alt-Del для Nios.
ресет.
Но только это не Ctrl-Alt-Del. Да и вообще это разные сущности - Ctrl-Alt-Del это относится к операционной системе, а не к процессору. А если у вас функция зависла - переписать функцию, с возможностью ее прерывания. В общем опишите проблему.
Например, зависла функция работы в режиме прямого доступа к памяти, программа ожидает подтверждение завершения получения данных, а подтверждения нет. Понятно можно сделать таймер и по завершению его работы, завершить работу DMA и выйти из функции.
Можно ли вместо этого сделать прерывание по окончании таймера, в прерывании остановить DMA и затем востановить контекст из стека и таким образом выйти из функции? (звучит как бред конечно)
Golikov A.
Aug 4 2014, 15:25
почему бред? Все так и надо, можно сделать аналог вочьдога на таймере, а по прерыванию таймера определять откуда в него ввалились, и корректно завершать задачи. В штатном режиме таймер сбрасывается и прерывания не возникает...
Так же возможно и другие варианты
Dmitriyspb
Aug 5 2014, 08:30
Поддерживаю идею watchdog! Нормальное решение.
Цитата
Все так и надо, можно сделать аналог вочьдога на таймере, а по прерыванию таймера определять откуда в него ввалились, и корректно завершать задачи
Правильно ли я понял, что нужно в прерывании выставить какую-нибудь переменную в 1 и по возвращеении из прерывания проверить условие и если переменная установленна в 1 то завершить функцию? Если так, то я имел ввиду не это.
Я имел ввиду следующее: при заходе в функцию контекст в том числе и место возвращения сохраняются в стек, можно ли в прерывании востановить контекст и продолжить выполнение так как будто программа вообще не заходила в функцию?
Golikov A.
Aug 5 2014, 11:27
конечно, операционки так задачи переключают.
через флаг - простой вариант, еще проще вообще не входить в прерывание, а в задачах склонных к зависанию отслеживать наличие флага прерывания от таймера и по нему брякаться, не надо входить и выходить.
Отслеживание контекста более сложная задача, но тоже реальная. Другое дело надо будет иметь карту всех функций, чтобы по счетчику понимать из какой функции вы суда попали, но тоже решаемо...
Цитата
конечно, операционки так задачи переключают.
А подскажите, чтобы такое почитать и посмотреть, чтобы освоить такое программирование - потому-что пока я даже не представляю с чего начать.
Работаю с NIOS.
Golikov A.
Aug 5 2014, 19:09
фиг знает... это обычно в архитектуре описывают, потому надо наверное читать про архитектуру НИОСа.
Общий смысл такой, что при входе в прерывание у вас должен быть известен счетчик команд (чтобы вернуться из прерывания) счетчик команд - это указание на код из которого вы прилетели в прерывание. Если взять карту размещения функций в памяти у вас будут адреса начала и конца каждой функции, тот диапазон куда попал счетчик команд из той функции вас и дернули.
Чтобы в нее вернутся достаточно в счетчик команд загрузить это сохраненное значение, и программа пойдет дальше так как будто ее не прерывали. Только в разных архитектурах есть бонусы,в АРМ надо восстановить еще 5 регистров, и задать режим работы. Процедуру входа и выхода из прерывания надо читать в описании проца, сделать как написано и все...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.