Страница 1 из 1

PIC, правильный выход из прерывания в спячку

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

Код: Выделить всё

...
sleep
nop      ; после выхода из спячки по прерыванию первым делом исполнится следующая за sleep команда - подстраховались
goto $-2    ; вернувшись в это место из прерывания выполняется переход снова к спячке 
...
по идее можно nop убрать и сделать goto $-1, поскольку goto занимает 2 цикла, а после спячки выполняется отгруженая на конвейер команда, т.е. в первый цикл оно сбросит конвейер, а на следующий уже перейдет к isr, но я не уверен в этом и не пробовал

Вобщем как опытные коты видят более правильное решение?
Заранее спасибо

Re: PIC, правильный выход из прерывания в спячку

Добавлено: Сб июн 19, 2010 08:36:27
uldemir
Можно делать и так, и так. Если GIE=0 - там просто цикл где перед goto start стоит sleep. Если же GIE=1 то после sleep обязательно надо ставить nop. Если нужно по нажатию кнопки только что-то выполнить и уснуть до следующего раза, я бы использовал первый вариант. Зачем изобретать лишние сущности. А, скажем, в часах - там нужно прерывание.

Re: PIC, правильный выход из прерывания в спячку

Добавлено: Сб июн 19, 2010 08:38:56
Rimsky
FlySnake писал(а):Всем привет
Вопрос по "правильности" программирования, наверное. Делаю девайс, который 99% времени находится в спячке. По нажатию кнопки просыпается, обрабатывает это нажатие в прерывании, делает свои грязные делишки и снова баиньки до следующего раза. В основной программе только инициализация девайса и собственно sleep. Вот вопрос: как правильнее выйти из прерывания и снова уснуть? Мне видится 2 варианта:
1. По окончании всех своих грязных делишек (а это всё идёт в подпрограмме обработки прерывания) выставить GIE в 1, разрешив вновь прерывания и собственно sleep.
2. Возвращатся из прерывания с помощью retfie в то место откуда оно произошло. Посколько происходит оно в спячке, то возвращаемся на +2 команды после спячки. Примерно так будет заканчиватся код основной программы:

Код: Выделить всё

...
sleep
nop      ; после выхода из спячки по прерыванию первым делом исполнится следующая за sleep команда - подстраховались
goto $-2    ; вернувшись в это место из прерывания выполняется переход снова к спячке 
...
по идее можно nop убрать и сделать goto $-1, поскольку goto занимает 2 цикла, а после спячки выполняется отгруженая на конвейер команда, т.е. в первый цикл оно сбросит конвейер, а на следующий уже перейдет к isr, но я не уверен в этом и не пробовал

Вобщем как опытные коты видят более правильное решение?
Заранее спасибо

Код: Выделить всё

Program_loop:
   sleep
   goto  Program_loop

Re: PIC, правильный выход из прерывания в спячку

Добавлено: Сб июн 19, 2010 13:24:26
FlySnake
Rimsky, это и есть 2-й вариант, только без nop после sleep. Вопрос был в правильности с точки зрения быдлокодерства :)
uldemir, ясно, спс. Так и сделаем