Увімкнути переривання, але без ISR


10

Я хотів би знати, що станеться, якщо перерва ввімкнена (напр .: Arbitration Lost Interrupt в CAN модулі LPC1778 NXP), але ISR для переривання не визначено.

Коли таке переривання трапляється, я знаю, що відповідний прапор переривання буде встановлений, але оскільки я не визначив жодного ISR, не буде жодної адреси зміщення вектора переривання для збереження передачі управління для такого переривання, і тому управління передасть назад до основного розпорядку, і я можу скинути прапор переривання, опитуючи його в основній процедурі (це те, що я думаю). Чи буде затримка, коли ЦП з'ясує, що немає ISR, на який можна перейти?

Будь-які рішення щодо того, що може статися, справді можуть мені допомогти.

Дякую.

Оновлення:

Я ввімкнув CAN Interrupt на моєму комп'ютері, але не визначив ISR. Коли я виконував тест на внутрішній цикл, код вводився у нескінченний цикл. Ось код розбирання нескінченного циклу, що виконується на LPC1778:

B       .
ENDP

Так що, якщо ви використовуєте переривання, використовуйте ISR.


3
Вам не потрібно вмикати переривання, щоб мати змогу опитуватись на прапори вашої основної функції. Якщо виникає умова, яка встановлює прапор, цей прапор буде встановлений, незалежно від того, ви включили пов’язане з цим переривання чи ні.
brhans

Ура говорить, що прапор перерви в програші "Арбітраж автобуса" буде встановлений, навіть якщо я не дозволяю "перервану в автобусі арбітражу втрачено" (хоча немає жодного реєстру статусу, який би міг свідчити про втрату арбітражу автобуса, крім реєстру статусу переривання)?
AlphaGoku

Так. У кожному MCU, з яким я працював, прапори переривання встановлюються, коли виникає умова, яка повинна їх встановити. Увімкнення переривання призводить до перемикання MCU на обробник, коли встановлений відповідний прапор, а відключення переривання призводить до того, що він ігнорує прапор, а не вектор для обробника, навіть якщо прапор встановлений . Вимкнення / переривання переривання впливає лише на поведінку перемикача переходу до переривання, а не на поведінку встановлення прапора.
brhans

Wow.Thats щось я не знав. Дуже дякую. Тому кожен водій повинен періодично також перевіряти регістри стану перерв і скидати їх, навіть якщо перерви не ввімкнули :)
AlphaGoku

@AkshayImmanuelD, тільки якщо це має значення. Якщо переривання завжди вимкнено, і прапор нічого більше не хвилює, то встановлений він чи очищений не має значення.
варення

Відповіді:


17

Якщо ISR не визначений, розташування інструкції про стрибок у векторі переривання буде чи недійсним, це може бути перехід до програми виключення, може перейти до початку програми, або може містити "повернення з перервати "(напр., РІТ) інструкція.

Ось розбирання таблиці переривань для процесора ATMega 16, що показує три невикористані переривання, що ведеться до процедури, яка обробляє такі випадки (вона може просто перейти в нескінченний цикл), і один законний вектор.

  28:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  2c:   0c 94 5c 00     jmp 0xb8    ; 0xb8 <__vector_11>   // <-- ISR
  30:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  34:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>

Який із описаних раніше способів поводження з відсутньою ISR буде залежати як від архітектури мікроконтролера, так і від компілятора. У випадку із інструкцією ІТР або еквівалентною інструкцією вона негайно повернеться до програми. Однак якщо переривання викликається рівнем, а не краєм, то це, ймовірно, спричинить повторне спрацьовування переривання, тож ви опинитесь у нескінченному циклі.

Я думаю, це може залежати від архітектури мікросхеми, чи вважатимуть внутрішні переривання (наприклад, персонаж, отриманий UART), ініційованим рівнем або краєм. Зовнішні переривання зазвичай можуть бути налаштовані як ті чи інші.

Є ще один випадок, іноді кілька переривань групуються разом і використовують один і той же вектор. Особливо це стосується старих процесорів, які, можливо, мали лише пару перерв. У такому випадку причину переривання визначали шляхом опитування статусу реєстрів переривань, яке схоже на те, що ви пропонуєте.

Але в будь-якому випадку поганою практикою є переривання в системі і не визначено ISR. Не робіть цього.


2
...., або це може бути невизначено.
Wouter van Ooijen

@WoutervanOoijen це те, що я мав на увазі під тим, що вектор переривання є нульовим.
tcrosley

1
Регістри статусу не можуть вказувати на кілька помилок, як ту, яку я згадав вище. Але такі помилки мають перерву. Отже, я подумав про можливість переривання просто ідентифікувати помилку і не використовувати будь-яку ISR. Симулюючи LPC1778 за допомогою Keil, я не отримав жодного винятку, тож я здогадуюсь, що UC повинен використовувати
ІТТ,

1
Що слід пам’ятати - якщо ви включите переривання, але ваш обробник не очистить прапор (або немає обробника, а поведінка за замовчуванням - це просто повернення), ви, швидше за все, виявите, що ваш MCU закінчиться назавжди застряг у петлі переривання.
брхани

1
Переривання PIO на ATSAM3X8E може бути запущено краєм, але встановлена ​​умова переривання не буде ліквідована, поки ви не прочитаєте ISR (реєстр статусу переривання) в обробнику переривання - в результаті чого згаданий цикл @brhans.
Саймон Райт

1

Це залежить від вашого MCU, компілятора та решти коду.

З мого досвіду:

  1. AVR - за замовчуванням, якщо ви не вказуєте ISR, вектор переривання у спалах буде 0x0000, а це означає, що ваша програма буде стрибати в режим скидання кожного разу, коли це переривання станеться.

    Якщо вам справді потрібне переривання, але вам не потрібен обробник (наприклад, використовуйте режим вимкнення живлення ADC з низьким рівнем шуму і використовуйте переривання лише для пробудження MCU), ви повинні використовувати макрос EMPTY_INTERRUPT

  2. NXP Kinetis (ARM) - всі вектори за замовчуванням вказують на обробник за замовчуванням, який має точку зламу, процесор просто зупиниться і повідомить про це своєму налагоджувачу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.