AVR. Навчальний курс. Керований вектор переривання. Системи переривань

У сімействі STM8 закладена дуже корисна можливістьекономії енергії у разі, коли швидкі та критичні на час обробки виконуються за перериваннями, а низькопріоритетні завдання працюють у фоновому режимі. Для цього використовується біт AL у регістрі GCR та машинна команда WFI. Однак тут був виявлений підводний камінь, не описаний у поточної версії errata на кристал.

Ця проблема була виявлена ​​на кристалі stm8l152c6t6, встановленому на STM8L-Discovery board.
В основному процесі було ініціалізовано таймер TIM4 для роботи з переривань. Обробник переривання йому практично порожній (за винятком процедури скидання біта TIM_SR1_UIF у регістрі TIM4->SR1). Далі в основному процесі було дозволено запис в EEPROM шляхом розблокування MASS та ініційовано процедуру запису байта з генерацією IRQ після її закінчення. Після чого в регістрі GCR було встановлено біт AL і виконано команду WFI.
У обробнику переривань після завершення операції запису в EEPROM після читання вмісту FLASH->IAPSR знижується пріоритет виконуваного коду командою RIM або комбінацією PUSH #val/POP CC. Тобто. всередині EEPROM ISR дозволяються всі інші переривання. І було виявлено наступне: якщо EEPROM ISR була перервана іншим перериванням, то після повернення з вкладеного переривання виконання обробки EEPROM ISR припиняється (тобто таке враження, що CPU coreпереходить у стан WFI, виконаний основним процесом).
Ця помилка виявляється лише за наявності наступних умов:

  1. Перед виконанням WFI в основному процесі біт AL у регістрі GCR було встановлено
  2. Пріоритет EEPROM IRQ залишено за замовчуванням (тобто вміст регістру ITC->ISPR1 дорівнює 0xFF)

Можливі роботизалежно від:

  1. В основному процесі до виконання інструкції WFI скинути біт AL в GCR. При цьому після кожного переривання основний процес відновлюватиме своє виконання, що не дуже добре позначиться на енергоспоживання.
  2. Перед зниженням пріоритету всередині EEPROM ISR (тобто команд RIM або PUSH #val/POP CC) також скинути біт AL в GCR. Знову ж таки, в цьому випадку після завершення EEPROM ISR основний процес продовжить виконання, що не дуже добре позначиться на енергоспоживання.
  3. Змінити пріоритет EEPROM IRQ у регістрі ITC->ISPR1, наприклад записавши значення 0b11110111. Що найнезрозуміліше, після цього починають нормально працювати команди RIM або PUSH #val/POP CC всередині EEPROM ISR (тобто після повернення з вкладеного переривання обробка EEPROM ISR відновлюється).

Панове, хто має бажання/можливість, спробуйте відтворити цей баг інших кристалах сімейства STM8/STM8L. Бо якщо цей баг справді відтворюємо, то треба штовхнути STM щодо його виправлення або хоча б внесення в errata sheet.

Отримано офіційну відповідь від ST MCU Support Team:

SOLUTION PROPOSED BY SUPPORTER - 5/4/2017 15:52:59:
- Dear customer,

Якщо перевірка configure priority level to level 0 (main), інший interrupt executing IRET з AL bit set може put device back to WFI продовжувати реалізацію наступних інструкцій з попереднього коду, як наступність priority level forced to Level 0 previously.

I recommend до використання rather SW priorities than using RIM в interrupt routine.

Best regards,
ST MCU Support Team

Тут ми розберемо такі важливі теми, як: обробка переривань, вектори переривань, програмні переривання, IRQ, Загалом поговоримо на теми переривання.

Ідея перериваннябула запропонована в середині 50-х років та основна мета введення переривань – реалізація синхронного режиму роботи та реалізація паралельної роботиокремих пристроїв ЕОМ.

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

Переривання(Interrupt) - це сигнал, що змушує ЕОМ змінювати нормальний порядок виконання команд процесором.

Виникнення подібних сигналівобумовлено такими подіями, як:

  • завершення операцій введення-виведення.
  • закінчення заздалегідь заданого інтервалучасу.
  • спроба поділу на нуль.
  • збій у роботі апаратного пристрою та ін.

Обробка переривання

З кожним перериванням пов'язують число, зване номером типу перериванняабо просто номером переривання. Система вміє розпізнавати, яке переривання, з яким номером воно сталося, і запускає програму обробки переривання, що відповідає цьому номеру. Таким чином, при надходженні сигналу на переривання відбувається примусова передача управління від програми до системи, а через неї - до оброблювача переривань.

Наприклад перериванняз номером 9 - переривання від клавіатури, яке генерується при натисканні та при відтисканні клавіші. Використовується для читання даних із клавіатури. Позначається в ОС як IRQ 1, де IRQ- Позначення переривання, а 1 - пріоритет переривання. Дані про запити на переривання можна проаналізувати у диспетчері пристроїв:

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

Припустимо, що у момент надходження сигналу переривання від деякого джерела програма перебуває у рішенні. В результаті керування автоматично передається обробнику переривань. Після завершення обробки управління може бути знову передано в ту точку програми А, де її виконання було перервано:

Вектори переривань

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

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

Таблиця векторів перериваньзаймає перший кілобайт оперативної пам'яті- адреси від 0000: 0000 до 0000: 03FF. Таблиця складається з 256 елементів - FAR-адрес обробників переривань. Ці елементи називаються векторами переривань. У першому слові елемента таблиці записано зміщення, а в другому адресу сегмента обробника переривання. Вектори просто повні адресипам'яті програми (у сегментованій формі), яка має бути активізована у разі виникнення переривання.

Переривання з номером 0 відповідає адреса 0000:0000, переривання з номером 1 - 0000:0004 і т.д. Адреса така складається з пари 2-байтових слів, тому кожен із векторів займає чотири байти.

Ви можете переглянути таблицю векторів переривань на комп'ютері, якщо скористатися програмою DEBUG. Використовуйте команду D, щоб вивести вміст початку пам'яті: D 0:0. Програма DEBUG покаже вам перші 128 байтів або 32 вектори, які можуть мати вигляд на кшталт наступного:

0000:0000 E8 4E 9A 01 00 00 00 00-C3 E2 00 F0 00 00 00 00
0000:0010 F0 01 70 00 54 FF 00 F0-05 18 00 F0 05 18 00 F0
0000:0020 2C 08 51 17 D0 0A 51 17-AD 08 54 08 E8 05 01 2F
0000:0030 FA 05 01 2F 05 18 00 F0-57 EF 00 F0 F0 01 70 00
0000:0040 90 13 C7 13 4D F8 00 F0-41 F8 00 F0 3E 0A 51 17
0000:0050 5C 00 B7 25 59 F8 00 F0-E2 0A 51 17 9C 00 B7 25
0000:0060 00 00 00 F6 8E 00 DE 09-6E FE 00 F0 F2 00 7B 09
0000:0070 27 08 51 17 A4 F0 00 F0-22 05 00 00 00 00 00 F0

Вектори зберігаються як «слова навпаки»: спочатку усунення, а потім сегмент. Наприклад, перші чотири байти, які програма DEBUG показала вище (E8 4E 9A 01) можна перетворити на сегментовану адресу 019A:4EE8.

Можна зустріти три види адрес в таблиці векторів. Це можуть бути адреси, що вказують на ROM-BIOS, які можна ідентифікувати шістнадцятковою цифрою F, яка передує номеру сегмента. Це можуть бути адреси, які вказують на головну пам'ять (як у прикладі: 019A: 4EE8). Ці адреси можуть вказувати на підпрограми ДОС або на резидентну програму(наприклад, SideKick або Prokey), або вони можуть вказувати на саму програму DEBUG(оскільки DEBUG повинна тимчасово керувати перериванням). Також вектори можуть складатися з одних нулів, коли переривання з цим номером не обробляється в даний момент.

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

Нижче наведено призначення деяких векторів:

Опис
0 Помилка розподілу. Викликається автоматично після виконання команд DIV або IDIV, якщо в результаті розподілу відбувається переповнення (наприклад, при розподілі на 0).
2 Апаратне переривання, що не маскується. Це переривання може використовуватися по-різному в різних машинах. Зазвичай виробляється при помилці парності в оперативній пам'яті та при запиті переривання від співпроцесора.
5 Друк копії екрану. Генерується при натисканні на клавіатурі клавіші PrtScr. Зазвичай використовується для друку зображення.
8 IRQ0 - переривання інтервального таймера, що виникає 18,2 рази на секунду.
9 IRQ1 – переривання від клавіатури. Генерується при натисканні та при відтисканні клавіші. Використовується для читання даних з клавіатури.
A IRQ2 - використовується для каскадування апаратних переривань у машинах класу AT
B IRQ3 - переривання асинхронного порту COM2.
C IRQ4 - переривання асинхронного порту COM1.
D IRQ5 - переривання від контролера жорсткого дискадля XT.
E IRQ6 - переривання генерується контролером флоппі-диска після завершення операції.
F IRQ7 – переривання принтера. Генерується принтером, коли він готовий до виконання чергової операції. Багато адаптерів принтера не використовують це переривання.
10 Обслуговування відеоадаптера.
11 Визначення конфігурації пристроїв у системі.
12 Визначення розміру оперативної пам'яті у системі.
13 Обслуговування дискової системи
14 Послідовне введення/виведення.
1A Обслуговування годинника.
1B Обробник переривання Ctrl-Break.
70 IRQ8 - переривання від годинника реального часу.
71 IRQ9 - переривання від контролера EGA.
75 IRQ13 - переривання від математичного співпроцесора.
76 IRQ14 – переривання від контролера жорсткого диска.
77 IRQ15 – зарезервовано.

IRQ0 - IRQ15 - це апаратні переривання.

Механізм обробки переривань

При обробці кожного переривання має виконуватися така послідовність дій:

  • Сприйняття запиту на переривання: прийом сигналу та ідентифікація переривання.
  • Запам'ятовування стану перерваного процесу: визначається значенням лічильника команд (адресою наступної команди) та вмістом регістрів процесора.
  • Передача управління програмі, що перериває (у лічильник команд заноситься початкова адреса підпрограми обробки переривань, а у відповідні регістри – інформація зі слова стану процесора).
  • Обробка переривання.
  • Відновлення перерваного процесу та повернення в перервану програму.

Головні функції механізму переривання:

  1. розпізнавання чи класифікація переривань.
  2. передача управління відповідно до оброблювача переривань.
  3. коректне повернення до перерваної програми (перед передачею управління обробнику переривань вміст регістрів процесора запам'ятовується або пам'яті з прямим доступом або системному стеку).

Типи переривань

Переривання, що виникають під час роботи обчислювальної системи, можна розділити на 4 групи:

Апаратні перериваннявикликаються фізичними пристроямиі виникають стосовно програми асинхронно, тобто. у загальному випадку неможливо передбачити, коли і чому програма буде перервана.

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

Зовнішні перериваннявиникають по сигналу будь-якого зовнішнього пристрою, наприклад:

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

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

Зовнішні переривання, що маскуються і не маскуються.

Існують два спеціальні зовнішніх сигналівсеред вхідних сигналівпроцесора, за допомогою яких можна перервати виконання поточної програмиі тим самим переключити роботу центрального процесора. Це сигнали NMI(Non Mascable Interrupt, немасковане переривання) INTR(interrupt request, запит на переривання).

Відповідно зовнішні переривання поділяються на два види: немасковані і маскувані.

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

Таким чином, наявність сигналу переривання не обов'язково має викликати переривання програми, що виконується. Процесор може мати засоби захисту від переривань: відключення системи переривань, маскування (заборона) окремих сигналів переривань. Переривання, які замаскувати не можна — це переривання, що не маскуються.

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

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

Програмні переривання

Програми можуть самі викликати переривання із заданим номером. Для цього використовують команду INT. По цій команді процесор здійснює практично ті ж дії, що і при звичайних перериваннях, але тільки це відбувається в передбачуваній точці програми - там, де програміст помістив цю команду. Тому програмні перериванняне є асинхронними (програма «знає», коли вона викликає переривання).

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

Механізм програмних перериваньбув спеціально введений для того, щоб:

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

Приклад (програмні переривання):

  • привілейована команда у режимі користувача.
  • адреса поза діапазоном.
  • порушення захисту пам'яті.
  • арифметичне переповнення, відсутня сторінка.
  • Порушення захисту сегмента.
  • вихід зарубіжних країн.

У спрощеному вигляді схему обробки різних видівперериваньможна уявити так:

КП - контролер переривань, має кілька рівнів (ліній) для підключення контролерів пристроїв (на схемі позначені КУ). Можливе каскадне підключення контролерів, коли на один із його входів підключається ще один контролер переривань. ЦП – центральний процесор.

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

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

У разі переривання самої програми обробки переривання говорять про вкладеному перериванні. p align="justify"> Рівні пріоритетів позначаються скорочено IRQ0 - IRQ15 або IRQ0 - IRQ23 (залежно від мікросхемою реалізації).

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

Ну і нарешті реалізація механізму обробки переривань

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

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

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

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

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

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

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

У третьому елементі вказується, чи виконує процесор команди, чи простоює. У четвертому елементі міститься покажчик, що ідентифікує поточну програму, що виконується. У п'ятому елементі міститься маска переривань, яка використовується для контролю дозволу переривань (поле MASK).

Це поле використовується, щоб не допустити настання переривань певного типу, Доки перше з них не буде оброблено. У MASK кожен біт відповідає деякому класу переривань. Якщо якийсь біт встановлено в 1, то переривання відповідного класу дозволено, якщо в 0, то заборонено. В останньому випадку кажуть, що вони масковані(їх також називають забороненимиабо закритими). Однак масковані переривання не губляться, тому що сигнал, що спричинив переривання, зберігається апаратурою. Тимчасово затримане таким способом переривання називається відкладеним. Коли (внаслідок того, що значення MASK скинуто) переривання відповідного класу знову дозволяються, сигнал розпізнається і відбувається переривання.

Маскування переривань перебуває під контролем операційної системи та залежить від значення MASK у слові стану, яке заздалегідь зберігається у робочій області кожного переривання. Можна заборонити всі переривання, встановивши всі біти MASK на нуль. Насправді чинити подібним чиномнемає необхідності.

Найважливішими характеристиками системи переривань є глибина переривань та пріоритет. У ЕОМ існує однорівнева та багаторівнева система переривань. В однорівневих системах немає реакції при обробці переривань на сигнали інших переривань, що надходять. Задоволення запитів на переривання в таких системах здійснюється тільки після завершення обробки переривання, що виникло раніше. У сучасних ПК використовуються багаторівневі системи, що допускають переривання різної глибини Глибина переривань – це максимальна кількістьпрограм ISR, які можуть переривати одне одного. При цьому якщо глибина переривань п, то може бути перервано п підпрограм. Глибина можливих переривань залежить від класу завдань і визначається організацією черговості обробки переривань. Запити, що одночасно надійшли, на переривання на регістр переривань МП, обробляються за принципом пріоритетності. В першу чергу обслуговуються переривання з найвищим пріоритетом. При надходженні запитів на переривання відповідний тригер у регістрі переривань встановлюється в 1. Перед завершенням виконання чергової команди МП опитує регістр переривань. Черговість реалізації запитів на переривання встановлюється порядку пріоритету, заздалегідь присвоєного кожному типу переривання. Присвоєння пріоритету є складне завдання, при вирішенні якої необхідно враховувати важливість та терміновість обслуговування тих чи інших переривань. Зазвичай найвищий пріоритет мають переривання від схем управління енергоспоживанням і з машинної помилки.

Переривання підпрограм ISR називається вкладенням переривань. Для організації вкладених переривань у кожній підпрограмі обслуговування переривань необхідно виконати:

1. дозволити переривання за командою EI

2. тимчасово запам'ятати пріоритет перерваної програми

3. завантажити у схему пріоритетних переривань новий поточний пріоритет

4. обслужити це переривання

5. відновити колишній пріоритет

6. відновити перервану програму (командою IRET)

Апаратні переривання:

Внутрішні (від процесора та співпроцесора)

Зовнішні:

Масковані

Немасковані

Програмно-викликані переривання

До внутрішніх переривань можна віднести і програмно-викликані переривання. Внутрішні переривання МП генеруються у разі особливих умов і під час поточної команди (приклад: розподіл на нуль переповнення розрядної сітки тощо.).

Програмно-викликані переривання виконуються під впливом команди INT, й у разі дії МП аналогічні виклику програми ISR, тобто. збереження в стеку адреси повернення, передача управління за вказаною адресою, але є й деякі відмінності:

A) виконується переривання, поміщене в стік і регістрі прапорів скидається в 0 біт IF (дозволу обробки переривань).

Б) замість адреси підпрограми, що викликається аргументом виклику є номер вектора переривань.

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

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

Механізм переривання забезпечується відповідними апаратно- програмними засобамикомп'ютера.

Класифікація переривань представлена ​​рис. 7.1.


Мал. 7.1.

Запити апаратних переривань виникають асинхронно по відношенню до роботи мікропроцесора та пов'язані з роботою зовнішніх пристроїв.

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

Для запитів маскуваних перериваньвикористовується вхід мікропроцесора INT. Обробка запиту перериванняпо даному входуможе бути заблокована скиданням біта IF в регістрі прапорівмікропроцесора.

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

Програмні переривання поділяються на такі типи.

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

Пастка- особливий випадок, який виявляється після закінчення виконання команди (наприклад, наявність у програмі команди INT n або встановлений прапор TF регістрі прапорів). Після обробки цього переривання виконання програми продовжується з наступної команди.

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

Порядок обробки переривань

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

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

Обробка запитів переривань складається з:

  • "рефлекторних" дій процесора, які однакові для всіх переривань і особливих випадківі якими програміст керувати не може;
  • виконання створеного програмістом обробника.

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

Тип перериваннядля програмних перериваньвводиться зсередини мікропроцесора; наприклад, переривання за відсутністю сторінки пам'яті має тип 14. Для переривань, викликаних командою INT n, тип міститься у самій команді. Для апаратних переривань, що маскуються, тип вводиться з контролера пріоритетних перериваньпо шині даних. Немаскованого перериванняпризначено тип 2.

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

"Рефлекторні" дії мікропроцесора з обробки запиту перериваннявиконуються апаратними засобами МП і включають:

  • визначення типу переривання ;
  • збереження контексту програми, що переривається (деякій інформації, яка дозволить повернутися до перерваної програми та продовжити її виконання). Завжди автоматично зберігаються як мінімум регістри EIPта CS , що визначають точку повернення в перервану програму, та регістр прапорів EFLAGS . Якщо виклик обробника переривання проводиться з використанням шлюзу завдання, то пам'яті повністю зберігається сегмент стану TSS задачі, що переривається;
  • визначення адреси оброблювача перериваннята передача управління першій команді цього оброблювача.

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

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


Мал. 7.3.

Вміст регістру IDTr не зберігається в сегментах TSS і не змінюється при перемиканні завдання. Програми не можуть звернутися до IDT, так як єдиний біт TI індикатора таблиців селекторсегмента забезпечує вибір лише між таблицями GDTі LDT.

Максимальна межа таблиці дескрипторів переривань становить 256*8 – 1 = 2047.

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

У IDTможуть зберігатися лише дескриптори таких типів:

  • шлюз пастки ,
  • шлюз переривання, шлюз завдання.

Сторожові таймери.

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

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

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

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

Багато користувачів вважають, що переривання - це та частина апаратного забезпечення, яку краще дати спокій, тому що їх використання вимагає чудового знання процесора для розробки програми обробки переривання. Інакше у разі переривання система «засинає» чи «йде врознос». Таке почуття зазвичай з'являється у розробника після досвіду роботи з перериваннями для персонального комп'ютера, який має низку особливостей, що ускладнюють створення переривань. Багато з цих проблем не мають місця в устаткуванні, реалізованому на базі мікроконтролерів. Використання в даному устаткуванніпереривань може суттєво спростити його розробку та застосування.

Якщо ви ніколи не мали справу з перериваннями, то у вас виникне питання – що це таке? У комп'ютерної системипереривання - це запуск спеціальної підпрограми (яка називається «обробником переривання» або «програмою обслуговування переривання»), який викликається сигналом апаратури. Під час виконання цієї підпрограми реалізація поточної програми зупиняється. Термін «запит на переривання» (interrupt request) використовується тому, що інколи програма відмовляється підтвердити переривання та виконати обробник переривання негайно (рис. 2.19).


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

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

Мал. 2.18 – Виконання переривання.

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

Обробник переривання завжди забезпечує таку послідовність дій:

2. Скинути контролер переривань та обладнання, що викликало запит.

3. Обробити дані.

4. Відновити вміст регістрів контексту.

5. Повернутися до перерваної програми.

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

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

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

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

Відновлення регістрів контексту та виконання команди повернення з переривання переводить процесор у стан, у якому перебував до виникнення переривання.

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

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

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

Адреса, яка завантажується в програмний лічильник під час переходу до обробника переривання, називається «вектор переривання». Існує кілька типів векторів. Адреса, яка завантажується в програмний лічильник під час запуску мікроконтролера (reset) називається «вектор скидання». Для різних переривань можуть бути задані різні вектори, що позбавляє програму обслуговування необхідності визначати причину переривання. Використання різними перериваннями одного вектора зазвичай не викликає проблем при роботі мікроконтролерів, оскільки найчастіше мікроконтролер виконує одну програму. Цим мікроконтролер відрізняється від персонального комп'ютера, у процесі експлуатації якого можуть додаватися різні джерелапереривань. (Якщо ви коли-небудь підключали два пристрої до портів СОМ1 та COM3, то ви уявляєте, про що йде мова). У мікроконтролері, де апаратна частина добре відома, не повинно виникнути будь-яких проблем при спільному використаннівекторів переривань.

Останнє, що залишилося розглянути, – це програмні переривання. Існують процесорні команди, які можуть бути використані для імітації апаратних переривань. Найбільш очевидне використання цих команд - це виклик системних підпрограм, які у довільному місці пам'яті, чи вимагають звернення до них міжсегментних переходів. Ця можливість реалізована у мікропроцесорах сімейства Intel i86 і використовується в базової системи введення-виведення BIOS(Basic Input/Output System) та операційній системі DOS персональних комп'ютерівдля виклику системних підпрограм без фіксації точки входу. Натомість використовуються різні вектори переривань, що вибирають команду, яка повинна виконуватися, коли відбувається таке програмне переривання.

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