PIC, правильный выход из прерывания в спячку
Добавлено: Сб июн 19, 2010 00:03:57
Всем привет
Вопрос по "правильности" программирования, наверное. Делаю девайс, который 99% времени находится в спячке. По нажатию кнопки просыпается, обрабатывает это нажатие в прерывании, делает свои грязные делишки и снова баиньки до следующего раза. В основной программе только инициализация девайса и собственно sleep. Вот вопрос: как правильнее выйти из прерывания и снова уснуть? Мне видится 2 варианта:
1. По окончании всех своих грязных делишек (а это всё идёт в подпрограмме обработки прерывания) выставить GIE в 1, разрешив вновь прерывания и собственно sleep.
2. Возвращатся из прерывания с помощью retfie в то место откуда оно произошло. Посколько происходит оно в спячке, то возвращаемся на +2 команды после спячки. Примерно так будет заканчиватся код основной программы:по идее можно nop убрать и сделать goto $-1, поскольку goto занимает 2 цикла, а после спячки выполняется отгруженая на конвейер команда, т.е. в первый цикл оно сбросит конвейер, а на следующий уже перейдет к isr, но я не уверен в этом и не пробовал
Вобщем как опытные коты видят более правильное решение?
Заранее спасибо
Вопрос по "правильности" программирования, наверное. Делаю девайс, который 99% времени находится в спячке. По нажатию кнопки просыпается, обрабатывает это нажатие в прерывании, делает свои грязные делишки и снова баиньки до следующего раза. В основной программе только инициализация девайса и собственно sleep. Вот вопрос: как правильнее выйти из прерывания и снова уснуть? Мне видится 2 варианта:
1. По окончании всех своих грязных делишек (а это всё идёт в подпрограмме обработки прерывания) выставить GIE в 1, разрешив вновь прерывания и собственно sleep.
2. Возвращатся из прерывания с помощью retfie в то место откуда оно произошло. Посколько происходит оно в спячке, то возвращаемся на +2 команды после спячки. Примерно так будет заканчиватся код основной программы:
Код: Выделить всё
...
sleep
nop ; после выхода из спячки по прерыванию первым делом исполнится следующая за sleep команда - подстраховались
goto $-2 ; вернувшись в это место из прерывания выполняется переход снова к спячке
...Вобщем как опытные коты видят более правильное решение?
Заранее спасибо