[an error occurred while processing this directive]
|
Три варианта ISR получается:
1). C автоматическим сохраненимем status
2). Нет автоматического сохранения, но исполбзуем незанятые
уровни стека статуса
3). Сохраняем статус вручную
И вот как это будет:
//------------------------------------------ [1]
isr1: bit set mode1 IRPTEN;
...
rti;
//------------------------------------------ [2]
isr2: push sts;
bit set mode1 IRPTEN;
...
pop sts;
rti;
//------------------------------------------ [3]
isr3: dm(isr3_mode1)=mode1;
bit set mode1 IRPTEN;
dm(isr3_astst)=astat;
...
astat=dm(isr3_astat);
mode1=dm(isr3_mode1);
rti;
//------------------------------------------
В третьем варианте нужно сохранять и восстанавливать mode1 обязательно именно потому, что можно влететь в обработчик прерывания со сброшенным IRPTEN, значит и выйти из него нужно тоже со сброшенным: ведь раз его сбросили вручную - эначит это было нужно!
Разумеется в точке где его сбрасывали нужен 1 nop от команды сброса до начала защищаемого от участка (latency). Вроде нигде не соврал?
E-mail: info@telesys.ru