[an error occurred while processing this directive] [an error occurred while processing this directive]
Береженого Бог бережет, сказала монашка, и натянула на свечку презерватив :))
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено BLACKEAGLE 07 апреля 2002 г. 19:36
В ответ на: Ответ: Может ты и прав, и даже делал так, но в PDF сказано так:"Нижайшие адреса программной памяти АВТОМАТИЧЕСКИ определяются как Ресет и вектора прерываний". Так что попробовать добавить RETI и ORG по-моему стоит. отправлено vesna4 07 апреля 2002 г. 08:36

И одно, и другое - ненужные/бессмысленные предосторожности. Да, вектора прерываний должны располагаться строго по предопределенным адресам, но это имеет смысл лишь тогда, когда эти прерывания ДЕЙСТВИТЕЛЬНО задействованы в конкретном проекте. Если, допустим, у меня в 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