[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
И одно, и другое - ненужные/бессмысленные предосторожности. Да, вектора прерываний должны располагаться строго по предопределенным адресам, но это имеет смысл лишь тогда, когда эти прерывания ДЕЙСТВИТЕЛЬНО задействованы в конкретном проекте. Если, допустим, у меня в 2313 кроме безусловного/обязательного RESET задействовано лишь прерывание INT0, то я напишу так:
org 0
rstvect:
rjmp main ;Это вектор RESET
org 1 ;По int0 управление попадает сюда
int0vect:
... ;Это вектор, но он же и обработчик INT0
...
...
reti
main:
ldi temp,stacktop ;Это уже главная программа, она же - обработчик RESET
...
...
...
...
Как видите, вместо того, чтобы выкинуть на ветер 254 драгоценных байта, я потратил всего 2 - на единственный вектор RESET, а обработчик INT0 написал прямо поверх "священной" таблицы векторов, сэкономив кроме всего прочего и пару тактов на ставший ненужным RJMP int0proc.
Есть, правда, у такого "хамства" и отрицательный аспект. Дело в том, что при весьма маловероятном сбое, который сдуру вдруг разрешит одно из незадействованных прерываний и еще установит флаг такового, управление попадет туда, где вместо вектора лежит мой код, и станут выполняться те команды, которые образованы этим самым кодом (и хорошо еще, если на векторный адрес не попадет, допустим, второе слово от LDS/STS или вообще кусок какой-нибудь текстовой строки, тогда вообще все разлетится). Правила "техники безопасности" в таких случаях рекомендуют заполнять незадействованные вектора командами RETI, а для пущей вящести вообще писать коротенькие обработчики ВСЕХ незадействованных прерываний хотя бы для того, чтобы сбросить флаги, разрешившие/вызвавшие такие прерывания. Но это уже похоже на посмертную реанимацию, т.к. если такой казус случится, то полумер будет недостаточно.
E-mail: info@telesys.ru