[an error occurred while processing this directive]
|
Точно то, о чем Вы спрашиваете, можно сделать так:
т.к. при входе в прерывание IMASK/MSTAT/ASTAT сохраняются в статусном стеке, есть только один выход - выгрузить значения из стека/модифицировать/загрузить назад:
.....
pop sts;
imask = NEW_MASK;
push sts;
....
между pop и push НЕЛЬЗЯ использовать что-то, модифицирующее ASTAТ и MSTAT (например арифметические инструкции). Кроме того, перегрузка MSTAT может вызвать переключение банка регистров - т.е. "дублированные" регистры использовать нельзя.
Резюме: то, о чем Вы спрашиваете, сделать возможно, но крайне нежелательно (и, по крайней мере требует хорошего понимания происходящего). IMHO надо задуматься над алгоритмом - гораздо проще управлять прерыванием ВНЕ прерывания - как правило можно обойтись без "экзотики" :-)
Есть еще и другой метод управления прерыванием - он использован в примере от AD ("Engineer To Engineer Note EE-51") - можно не запрещать прерывание, а просто заменить jump в таблице прерываний на rti или jump на другой обработчик прерывания:
.....
rti; nop; nop; nop;
interrupt_address: jump interrupt; nop; nop; nop;
rti; nop; nop; nop;
.....
rti_command: rti;
.....
interrupt1: jump interrupt 1;
.....
i4 = interrupt_address;
i5 = rti_command;
m4 = 0;
ar = pm(i5,m4);
pm(i4,m4) = ar; //переключение на "пустой" обработчик
......
i4 = interrupt_address;
i5 = interrupt1;
m4 = 0;
ar = pm(i5,m4);
pm(i4,m4) = ar; //переключение на альтернативный обработчик
.....
нужно отметить неявное использование PX в это примере, т.к. длина слова программной памяти 24 бита
Почитать можно "ADSP-218x DSP HW Ref", p 3-20 и "ADSP-218x Instruction Set Ref" p. 4-155
E-mail: info@telesys.ru