[an error occurred while processing this directive] [an error occurred while processing this directive]
Рационально - вот так, без стека:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено BLACK EAGLE 15 февраля 2002 г. 15:24
В ответ на: Как в AVR сохранить регистр состояния (флаги) в стек. Только косвенно по физическому адресу? отправлено stur 15 февраля 2002 г. 14:16

Выделите пару нижних регистров (кроме R0 и R1, т.к. они могут понадобиться для MUL/LPM/SPM) под эти цели - один для фона, другой для прерывания:


.def stat =r2 ;Здесь будем сохранять статус из основной программы
.def istat =r3 ;Здесь будем сохранять статус из подпрограмм обслуживания прерываний

Далее используйте обычные in/out для сохранения/восстановления SREG:

В основной программе -


routine1:
in stat,sreg ;Вместо (push sreg)=in r2,sreg+push r2
...
...
...
out sreg,stat ;Вместо (pop sreg)=pop r2+out sreg, r2
ret

В подпрограммах обслуживания прерываний -


interrupt1:
in istat,sreg ;Вместо (push sreg)=in r3,sreg+push r3
...
...
...
out sreg,istat ;Вместо (pop sreg)=pop r3+out sreg, r3
reti

Выгода очевидна - так и так придется портить те же R2/R3 для PUSH/POP, при этом сохранять/восстанавливать их исходные значения для свободного использования вряд ли захочется - еще пара PUSH/POP, проще раз и навсегда ими пожертвовать, а при описанном выше подходе скорость будет максимально высокой.

Удачи!

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru