[an error occurred while processing this directive]
|
Тут только основная инициализация, которая м.б. нужна для примеров.
Примеров три.
Условия следующие:
1) софтварное прерывание №0 (USW0) вызывается в процессе обслуживания прерывания /IRQ1. Нестинг имеет место быть. За один вход в USW0 м.б. несколько входов в другие прерывания с более высоким приоритетом.
2) Также разрешены прерывания по SPR0, TMR низкоприоритетный.
3) Про сохранение контекста не говорю ничего, т.к примеры относятся к одной и той же проге.
4) Все 3 примера имеют одно и тоже время выполнения (для этого в примерах 2 и 3 добавлены nop).
Показания:
1) Примеры (софт) №2,3 работают без проблем.
2) Пример №1 работает очень неустойчиво, т.е. прога, в которой он используется может некоторое время работать совершенно корректно, а затем даёт дуба, проц не виснет, но подпрограмма обслуживания прерывания USW0 сбивается.
А непонятно вот что:
1) Почему то при сохранении astat с помощью прямой адресации (к косвенной данное утверждение не относится) необходим nop сразу после данной команды (данное утверждение относится почему то только к моей проге и вывел я его совершенно самостоятельно; то ли звёзды не так встали, то ещё чего - не понимаю).
#define XXX_ASTAT_OFFS 0
#define XXX_R0_OFFS 1
.section/dm dm_sec;
.var xxx_str[2];
.section/pm pm_sec;
main:
bit set mode1 IRPTEN|NESTM;
m6 = 1;
l5 = 0;
b5 = xxx_str;
...
// Пример 1:
.section/pm pm_sec;
usw0_occured:
dm(xxx_str+XXX_ASTAT_OFFS) = astat;
dm(xxx_str+XXX_R0_OFFS) = r0;
...
nop;
...
// Пример 2:
.section/pm pm_sec;
usw0_occured:
dm(xxx_str+XXX_ASTAT_OFFS) = astat;
nop;
dm(xxx_str+XXX_R0_OFFS) = r0;
...
// Пример 3:
.section/pm pm_sec;
usw0_occured:
dm(i5,m6) = astat;
dm(i5,m6) = r0;
...
nop;
...
E-mail: info@telesys.ru