Я хотел бы знать, что происходит, если прерывание включено (например: Арбитраж потерянное прерывание в модуле CAN LPC1778 NXP), но ISR не был определен для прерывания.
Когда происходит такое прерывание, я знаю, что соответствующий флаг прерывания будет установлен, но, поскольку я не определил никакого ISR, не будет никакого адреса смещения вектора прерывания, сохраненного для передачи управления для такого прерывания, и поэтому управление будет возвращаться обратно. в основную подпрограмму, и я могу сбросить флаг прерывания, опрашивая его в основной подпрограмме (это то, о чем я думаю). Будет ли задержка, когда процессор выяснит, что нет ISR, к которому можно перейти?
Любые решения о том, что может произойти, могут действительно помочь мне.
Спасибо.
Обновить:
Я включил прерывание CAN на моем uC, но не определил ISR. Когда я выполнил внутренний тест обратной петли, код вошел в бесконечный цикл. Вот код разборки бесконечного цикла, выполняемого на LPC1778:
B .
ENDP
Так что, если вы используете прерывания, используйте ISR.
источник
Ответы:
Если ISR не определен, местоположение для команды перехода в векторе прерывания будет либо нулевым, либо это может быть переход к подпрограмме исключения, либо переход к началу программы, либо он может содержать «возврат из прерывание "(например, RTI).
Ниже приведена разборка таблицы прерываний для процессора ATMega 16, показывающая три неиспользуемых прерывания, отнесенных к подпрограмме, которая обрабатывает такие случаи (она может просто войти в бесконечный цикл), и один допустимый вектор.
Какой из описанных ранее методов обработки отсутствующего ISR будет зависеть как от архитектуры микроконтроллера, так и от компилятора. В случае RTI или эквивалентной инструкции, она немедленно вернется к заявке. Однако, если прерывание инициируется по уровню, а не по фронту, то это, вероятно, приведет к повторному запуску прерывания, поэтому вы попадете в бесконечный цикл.
Я думаю, это может зависеть от архитектуры чипа, будут ли внутренние прерывания (например, символ, принимаемый UART) сработать по уровню или по фронту. Внешние прерывания обычно можно настроить как одно или другое.
Существует также еще один случай, иногда несколько прерываний группируются вместе и используют один и тот же вектор. Это было особенно верно для более старых процессоров, которые могли иметь только пару прерываний. В этом случае причина прерывания была определена путем опроса состояния регистров прерываний, что похоже на то, что вы предлагаете.
Но в любом случае плохая практика - иметь прерывания в системе и не определять ISR. Не делай этого.
источник
Это зависит от вашего MCU, компилятора и остального кода.
Из моего опыта:
AVR - по умолчанию, если вы не укажете ISR, вектор прерывания во флэш-памяти будет 0x0000, что означает, что ваше приложение будет перезагружаться при каждом возникновении этого прерывания.
Если вам действительно нужно прерывание, но не нужен обработчик (например, используйте режим АЦП с низким уровнем шума и используйте прерывание только для пробуждения MCU), вам следует использовать макрос EMPTY_INTERRUPT
NXP Kinetis (ARM) - все векторы по умолчанию указывают на обработчик по умолчанию, имеющий точку останова, процессор просто остановится и сообщит об этом вашему отладчику.
источник