[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Судя по паузе, с которой Вы ответили на моё сообщение
Вы бегло просматривали доку на AVR :-). Но для того,
что-бы понять смысл моего сообщения нужно более чётко
представлять систему команд AVR.
.
Так, действительно, в доке указан только один - "официальный"
стек, указатель которого расположен в пространстве IO.
Он работает как стек возвратов, но может использоваться
и для данных командами PUSH Rr, POP Rd (NB! за два такта
на команду).
.
НО! Есть в архитектуре AVR 16 разрядные регистры-указатели
X (r26/r27), Y (r28/r29), Z (r30/r31), которые служат
для сохранения/восстановления данных в SRAM. У них есть
очень интересные свойства - режимы АВТОпостинкремента и
АВТОпреддекремента. Таким образом пара команд
.
ST X+, Rr
LD Rd, -X
.
("рост" вверх) или
.
ST -X, Rr
LD Rd, X+
.
("рост" вниз)
.
по своему эффекту НИЧЕМ не отличается от команд
.
PUSH Rr
POP Rd
.
и выполняется за те-же 4 такта.
.
Например компилятор Си IAR ВООБЩЕ не использует "штатный"
стек возвратов для сохранения контекста (и правильно делает),
для этого он использует стек по указателю Y !
Вот пример входа в прерывание:
.
132 __interrupt void int_faza (void) {
\ __nearfunc __interrupt void int_faza();
\ int_faza:
\ 00000000 93EA ST -Y,R30 ;сохранение
\ 00000002 931A ST -Y,R17 ;исползуемых
\ 00000004 930A ST -Y,R16 ;регистров
\ 00000006 B71F IN R17,63 ;и статуса
;
; ..... тру-ля-ля
;
\ 0000002E BF1F OUT 63,R17 ;восстановление
\ 00000030 9109 LD R16,Y+ ;всего
\ 00000032 9119 LD R17,Y+ ;этого
\ 00000034 91E9 LD R30,Y+ ;добра
\ 00000036 9518 RETI
E-mail: info@telesys.ru