[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Выделите пару нижних регистров (кроме 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