Як контролер знає, коли перейти до ISR?


12

Я говорю про речі на основному рівні.

Наскільки я розумію, ядро ​​контролера просто виконує вказівки, витягнуті з пам'яті (Fetch - Decode - Execute). Коли прибуває Переривання, як ядро ​​/ ALU вирішує перейти до ISR?

Оскільки ми або компілятор не додаємо ніяких інструкцій для опитування стану переривання - то як же знати, що потрібно перервати?

Відповіді:


13

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

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

Спеціальна логіка прийняття переривань також повинна відключати переривання таким чином, щоб ця сама умова переривання не викликала чергового виклику на наступний цикл вектора переривання. У різних процесорів є різні способи поводження з цим. Найпростіший - це просто глобально відключити переривання, вимагаючи, щоб програмне забезпечення знову ввімкнуло їх після закінчення розпорядження служби переривання. Інші процесори мають рівень пріоритетності переривання. Цей рівень стикається так, що лише умови переривання з більш високим пріоритетом можуть спричинити нове переривання. Пріоритет переривання - це те, що автоматично зберігається разом із зворотною адресою CALL та відновлюється, коли код повертається з переривання.


1
Часто це не звичайна CALLінструкція, оскільки переривання припиняються по-іншому (пор. RETVs. RETI).
glglgl

1
Чи можу я з впевненістю припустити, що коли це обладнання для виявлення переривань подає сигнал, замість пам'яті, процесор отримує інструкцію з іншого місця про стрибок ... Можливо, як комутатор ... Коли перемикач вимкнено, вилучення інструкції з пам'яті та коли перемикач увімкнено , Виконати цю інструкцію?
Swanand

3

Зазвичай у сучасних мікроконтролерах є спеціалізований блок контролера переривання (IC), який відповідає за управління перебоями. Крім того , кожен периферійний компонент має переривання вихід (и) , який збирається з 0до 1(або навпаки) , якщо якесь - то умова застосовується (наприклад , це периферичного завершив певну роботу). Цей вихід підключений до контролера переривання. CoreCPU може сказати IC або ігнорувати це конкретне переривання (маскувати його) або повідомити MCU щоразу , коли це відбувається, викликаючи специфічні сигнали, а потім MCU вирішує , що робити з ним. Поширений спосіб полягає у тому, щоб ІМС повідомив MCU, який перерив стався, і перейти до відповідного коду обробки.


2

В ядрі комп'ютера є апаратне забезпечення, яке заносить нове значення в лічильник програм, що відповідає конкретному перериванню, яке було викликано. Для того, щоб запам'ятати, куди слід повернутися після завершення програми переривання, поточне значення в лічильнику програми висувається в стек перед тим, як апаратне забезпечення заклинить адресу переривання в лічильнику програми. Після завершення процедури переривання вихідне значення лічильника програми відновлюється назад із стека.

Значення заклинання в лічильнику програми під час перерви зазвичай визначаються однією з двох схем. Один підхід заклинює фіксовану адресу для кожного типу переривань у лічильник програми, а потім ядро ​​комп'ютера починає виконувати з цього фіксованого місця. Простір у фіксованому місці часто обмежений розміром, тому звичайно кодувати інструкцію про перехід за фіксованими адресами, які переходять на фактичне місцезнаходження служби переривання. Інша схема використовує щось, що називається векторною таблицею переривань. Тут апаратне забезпечення генерує фіксовану зміщення адреси у векторній таблиці на основі типу переривання. Потім апаратне обладнання витягує вміст у цьому місці таблиці і використовує це значення як адресу, щоб заклинити в лічильнику програми.


2

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

Контролер має вектор переривання (або іноді більше одного, залежно від типу переривання), який є адресою, де зберігається ISR. Ця адреса завжди однакова - це як вектор скидання, звідки запускається програма.

(Часто в цьому векторі зберігається інструкція про стрибок, яка переходить до фактичного коду для виконання, оскільки місця у векторі недостатньо для зберігання всієї процедури. Однак важливим є те, що ISR завжди розташований у тому самому положення.)

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

(В одному циклі інструкцій контролера є різні завдання, які він виконує: він отримує наступну інструкцію з адреси, на яку вказує лічильник програм; він збільшує лічильник програм; він декодує інструкцію та виконує її.)

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