Переривання

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Переривання (англ. interrupt) — сигнал, що повідомляє процесор або мікроконтролер про настання якої-небудь події, яка потребує невідкладної уваги щодо її обробки. При цьому виконання поточної послідовності команд може призупинитися (у випадку однопроцесорної системи), а керування передається обробнику переривання, який реагує на подію та обслуговує її, після чого повертає керування в перерваний код.[1]

Класифікація[ред. | ред. код]

Залежно від джерела виникнення сигналу переривання поділяються на:

  • Асинхронні або зовнішні (апаратні) — події, які створені зовнішніми джерелами (наприклад, периферійними пристроями) та можуть відбутися в довільний момент: сигнал від таймера, мережевої карти або дискового накопичувача, натискання клавіш клавіатури, рух миші;
  • Синхронні або внутрішні — виняткові ситуації у самому процесорі як результат порушення якихось умов при виконанні машинного коду: ділення на нуль або переповнення, звернення до неприпустимих адрес або неприпустимий код операції;
  • Програмні (частковий випадок внутрішнього переривання) — ініціюються виконанням спеціальної інструкції в коді програми. Програмні переривання, як правило використовуються для звернення до функцій вбудованого програмного забезпечення (firmware), драйверів й операційної системи.

Термін «пастка» (англ. trap) іноді використовується як синонім терміну «переривання» чи «внутрішнє переривання». Як правило, термінологія встановлюється в документації виробника конкретної архітектури процесора.

Обробка переривання[ред. | ред. код]

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

Обробка переривань відбувається відповідно до загальних принципів обробки переривань у мікропроцесорній техніці. Модуль переривань приймає запити переривання й організовує перехід до виконання визначеної програми. Запити переривання можуть надходити як від зовнішніх, так і від внутрішніх джерел (наприклад, у мікроконтролерах або системах на чипі). Для приймання запитів від зовнішніх джерел використовуються виводи портів вводу/виводу, для яких ця функція є альтернативною. Джерелами запитів зовнішніх переривань також можуть бути будь-які зміни зовнішніх сигналів на деяких спеціально виділених лініях портів вводу/виводу[2].

Якщо переривання відбувається під час виконання команди, що триває декілька циклів, перед викликом переривання завершується виконання цієї команди. Після виходу з переривання мікропроцесор завжди виконує ще одну команду, перш ніж перейти до якого-небудь іншого відкладеного переривання[3]:239.

Маскування[ред. | ред. код]

Залежно від можливості заборони зовнішні переривання поділяються на:

  • ті, що можна маскувати — переривання, які можна забороняти установкою відповідних бітів у регістрі маскування переривань (в x86-процесорах — скиданням IF у регістрі стану FLAGS або EFLAGS);
  • ті, що не можна маскувати (англ. Non maskable interrupt, NMI) — обробляються завжди, незалежно від заборон на інші переривання. Наприклад, таке переривання може бути викликане збоєм в мікросхемі пам'яті.

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

Пріоритезація переривань[ред. | ред. код]

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

Класифікація пріоритетів[ред. | ред. код]

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

Відносне обслуговування переривань означає, що якщо під час обробки переривання надходить пріоритетніше переривання, то це переривання буде оброблено тільки після завершення поточної процедури обробки переривання. Абсолютне обслуговування переривань означає, що коли під час обробки переривання надходить пріоритетніше переривання, то поточна процедура обробки переривання витісняється, і процесор починає виконувати обробку тільки-но отриманого більш пріоритетного переривання. Після завершення цієї процедури процесор повертається до виконання витісненої процедури обробки переривання (якщо не з'явилося нових). Проте, різні операційні системи мають різну філософію обробки переривань і даний процес може значно модифікуватися (для отримання оптимальної продуктивності) у залежності від навантаження на систему, користувацьких звичок, версії компонентів системи, апаратного обладнання тощо.

Перехоплення переривання — заміна обробника переривання на свій власний.

Таблиця переривань[ред. | ред. код]

Вектор переривання — закріплений за пристроєм номер, який ідентифікує відповідний обробник переривань. Вектори переривань об'єднуються в таблицю векторів переривань, що містить адреси обробників переривань. Розташування таблиці залежить від типу та режиму роботи процесора чи мікроконтролера.

Вектором переривання є адреса процедури обробки переривання[3]:230.

Вектори переривань від різних джерел об'єднані в структуру, що називається таблицею векторів переривань[3]:231.

Програмне переривання[ред. | ред. код]

Програмне переривання — синхронне переривання, яке може здійснити програма за допомогою спеціальної інструкції.

Архітектура x86[ред. | ред. код]

У процесорах архітектури x86 для явного виклику синхронного переривання є інструкція Int, аргументом якої є номер переривання (від 0 до 255). В IBM PC-сумісних комп'ютерах до початку завантаження ОС обробку переривань здійснюють підпрограми BIOS. Будь-який вектор переривання може бути перехоплений кодом BIOS карт розширень (наприклад, мережевих або відеокарт), операційною системою, і навіть звичайними (прикладними) програмами, які постійно знаходяться в пам'яті під час роботи інших програм (т. зв. резидентні програми). На відміну від реального режиму, в захищеному режимі x86-процесорів звичайні програми не можуть обслуговувати переривання: ця функція доступна тільки системному коду (операційній системі).

MS-DOS використовує для взаємодії зі своїми модулями і прикладними програмами переривання з номерами від 20h до 3Fh (числа дані в шістнадцятковій системі числення, як це прийнято при програмуванні мовою асемблера x86). Наприклад, доступ до основної множини функцій MS-DOS здійснюється виконанням інструкції Int 21h (при цьому номер функції та її аргументи передаються в регістрах). Цей розподіл номерів переривань не закріплений апаратно та інші програми можуть встановлювати свої обробники переривань замість або поверх вже наявних обробників, встановлених MS-DOS або іншими програмами, що, як правило, використовується для зміни функціоналу або розширення списку системних функцій. Також, цією можливістю користуються віруси.

Інші архітектури[ред. | ред. код]

У процесорах інших архітектур термін «програмне переривання» може бути синонімом поняттю системний виклик. Наприклад, інструкція SVC (англ. Supervisor Call) у архітектурі IBM System/360 викликає зазначену функцію у супервізорі операційної системи. Аналогічну за мнемонікою і призначенням команду SVC мають також процесори архітектури ARM.

Див. також[ред. | ред. код]

Примітки[ред. | ред. код]

  1. Погорелый С. Д., Слободанюк Т. Ф. Программное обеспечение микропроцессорных систем: Справочник. — ISBN 5-335-00169-0 (рос.).
  2. Левчук, О. М. (2016). Мікроконтролерні та робототехнічні системи. 
  3. а б в Евстифеев А. В. Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL. — 2. — Москва : Издательский дом «Додэка–XXI», 2005. — 560 с.

Література[ред. | ред. код]

  • Лисенков М. О. Обчислювальні та мікропроцесорні засоби в електронних апаратах. Навч. посібник для студентів усіх форм навчання спеціальностей: 7.091001, 7.091002, 7.091003, 7.091004 вищих навчальних закдадів. — Харків: ХНУРЕ, 2002. — 132 с.
  • Смирнова Н. В., Смирнов В. В. Метод организации параллельного выполнения задач в микроконтроллерах с малым объемом памяти программ //Збірник наукових праць Кіровоградського національного технічного університету. Техніка в сільськогосподарському виробництві, галузеве машинобудування, автоматизація. — 2015. — №. 28. — С. 317—321. Режим доступа: http://www.irbis-nbuv.gov.ua/cgi-bin/irbis_nbuv/cgiirbis_64.exe?C21COM=2&I21DBN=UJRN&P21DBN=UJRN&IMAGE_FILE_DOWNLOAD=1&Image_file_name=PDF/znpkntu_2015_28_52.pdf