Этот форум работает только в режиме просмотра и поиска.
Действующий форум переведен на новый движок и
находится по адресу
Как заставить...
Автор: Валерий (217.9.156.---)
Дата: 19/10/2004 16:59
После выполнения подпрограммы прерывания основная программа запускается с того
места, где прервалась. А если мне необходимо после прерывания каждый раз стартовать
с определённого места (чтоб не накапливалась ошибка)? Кто знает подскажите как
можно это сделать на языке Си в процессорах Atmel (например at90s2313 или at90s4414
или любом другом, понимающем язык Си).
А может посоветуем товарищу про WDT почитать :-)
А так вообще что за ошибка должна накапливатся?
Прога все равно в цикле должна крутиться, ну вот в нем и смотришь - если пришло прерывание (может
бит какой обработчик выставит, или просто не вернет из прерывания управление :-) вот по WDT и
сбросится проц ), то перейти по нужному адресу (при этом регистры надо будет инициализировать,
стек и так далее).
Re: :-) типа RTFM
Автор: Валерий (217.9.156.---)
Дата: 19/10/2004 20:27
Если верить даташиту, то минимальное время WDT составляет 16 мс. Как можно
мгновенно сбросить при помощи него?
AVR бывают с программным стеком, бывают с аппаратным.
При возникновении irq, выполняетя текущая команда, обновляется указатель на следующую команду
(РС), затем значение РС записывается в стек. Если стек программный, то после этого уменьшается
значение указателя стека (SPH:SPL), на 2.
Основная проблема которая может возникнуть это выполнение команд push в прерванной программе,
тогда действительно, однажды стек может быть исчерпан.
Если стек аппаратный, то проблема не актуальна, вследствие отсутствия команд push/pop.
Так вот, выполнение программы с предопределённого адреса означает, что состояние предыдущих
процедур мы должны забыть.
На практике это значит что надо проинициализировать указатель стека определённым значением.
start point
|________
/____ \
/___ /\
/ \
x z
| / \
/ \
/\ \
Предположим что управление надо передавать программе 'x'. А до этого выполнялось поддерево 'z',
или ещё какое. Значит после обработки прерывания значениее указателя стека должно быть таким,
каким было бы, при 'естесственной' передаче управления на ветку 'x'. Ну а дальше rjmp proc_name.
Итак, посмотрим, что говорит Б.Керниган и Д.Ритчи на в сером учебнике (к сожалению издания не
скажу - вырваны страницы). Итак в данном издании п.3.8.
"В Си имеются порицаемые многими инструкция Goto и метки для перехода на них. Строго говоря,
в этой инструкции нет никакой необходимости, и на практике можно легко без них обойтись...
...однако существуют случаи, в которых goto может пригодиться. Наиболее типична ситуация,
когда необходимо прервать обработку в некоторой глубоковложенной структуре и выйти сразу из
двух или большего числа вложенных циклов".
а там что обсуждали как использовать( точнее зачем грамотно )
надеюсь понятно
ещё мне оттуда последнее что запало как WaitFor сделать, задачи это набор флагов и
соответствующих ф-ций, а вот как WaitFor сделать я боюсь говорить глупости, но вот
что будет если из мейна вызвать ф-цию, а из ф-ции мейн, как-то так