Програмне забезпечення переривання проти функції


10

Приблизно через 3 роки роботи з MCU все ще не знаю, в чому використання програмного забезпечення перериває? Я зробив декілька робіт зі STM32 і ніколи не використовував програмні переривання. Дійсно, це велике питання для мене:

Чому, коли ми можемо використовувати просту функцію для виконання завдання, ми повинні використовувати програмне забезпечення для переривання? Які відмінності між програмним перериванням і функцією?

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


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

1
@MrPhooky Це апаратне переривання, про яке ти говориш. ОП говорить про переривання програмного забезпечення.
brhans

Відповіді:


19

Основна відмінність функції та програмного переривання - це те, що називається контекстом .

  • Функція працює в контексті вашої основної програми.
  • Перерва працює в контексті обробника переривання.

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

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


1
Крім того, переривання можуть довільно зупиняти прогрес програми, тому система може робити щось інше (наприклад, апаратні переривання). Вашим програмам не потрібно це враховувати, оскільки, з точки зору вашої програми, стан функції не змінюється з моменту, коли відбулося переривання. У старих системах так TMS (Terminate / Stay Resident) програми імітували багатозадачність шляхом підключення таймера / переривання годин. Навіть без рівнів IOPL було корисно, скажімо, оновлення системних годин.
фірфокс

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

@HannoBinder: я думаю, що в ОП йдеться про розміщення запитів на переривання у векторизованому контролері переривання Cortex-M3; якщо код для запитів переривання з високим пріоритетом є нижчим пріоритетом, запит буде відкладено до деякого пізнього часу, коли всі перерви з вищим пріоритетом закінчені.
supercat

12

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

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

У чому різниця між програмним перериванням і функцією?

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


2
Іншою поширеною схемою може бути переривання частотою 100 кГц для обробки критично важливих моментів, а також потрібна галочка таймера 1 кГц, але не мати двох окремих таймерів. Не потрібно багато часу накладних витрат, щоб сказати, що звичайна програма if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1; переривання частотою 100 кГц. Інший перерив може потім зробити свою справу і з короткочасними відключеннями перерв додати 100 до timer_count; навіть якщо для виконання 1 кГц процедура виконує більше 10 с, це не заважатиме 100 кГц.
supercat

Аналогічним чином я використовував програмні переривання в простих системах (без повного RTOS) як псевдопланувальник, де вимоги до апаратних засобів обробляються ISR, але функції зворотного виклику та інші тривалі завдання, які виконуються у відповідь на зміни в стан апаратури делегований програмному перериванню.
Злий собачий пиріг

Ви в основному описали варіацію "нижньої половини". Чи є у вас посилання на те, що це також називається "переривання програмного забезпечення"? Це зовсім інше значення, ніж відповідь Majenko, і питання позначене ARM - архітектура насправді має інструкцію SWI (програмне забезпечення переривання).
domen

3
@domen Я не впевнений, який тип посилання вам потрібен. Це називається "переривання програмного забезпечення", тому що саме для цього використовується. У контексті АРМ ОП спеціально посилалася на STM32 та надала посилання на посібник з посилання RM0008. Це не посібник з основної роботи ARM. Єдиний "програмний перерив", який охоплюється в RM0008, - це EXTI_SWIER (реєстр подій програмного забезпечення переривання), який може використовуватися для створення програмних переривань, незалежно від того, чи використовуються фактичні апаратні штифти для переривань. Я особисто не використовував інструкцію SWI (SWC).
Тута

Дякую! Можливо, було б добре включити частину цієї інформації у відповідь, щоб було зрозуміло, яке саме «програмне забезпечення перериває».
domen

7

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

Якщо ви не використовуєте ОС і керуєте всім кодом MCU, вам, ймовірно, не потрібно використовувати переривання програмного забезпечення. (Хоча, як згадував Тут, вони можуть мати і інше використання.)

В Linux і MS-DOS інтерфейси системного виклику на використання x86 програмних переривань, так що я буду пов'язувати з тими , в якості прикладу.


1
І в багатьох випадках, коли ОС використовує м'які переривання, вони вкладаються у функції, щоб зробити життя простішим.
hildred

1
Я все ще програмую речі (абсолютно нові) для DOS, і добре знайомий з обробниками int 21. Практично все, що мені потрібно з розуму вводу / виводу, обробляється за допомогою ISR DOS.
R Драст

Зауважте, що сторінка, що цитується для Linux, знаходиться в 1993-1996 роках.
CVn

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