Что такое прерывания

Этот текст для осваивающих программирование микроконтроллеров.

Почему именно микроконтроллеров, а в персоналках что — их нет? Есть. Но добраться до них рядовому программисту не получится. Все в глубине операционки. А в  микроконтроллерах еще Windows не появился и работать с прерываниями уметь надо, если хочешь сделать что-то сложнее мигания светодиодом.

Вообще механизм прерываний появился давно, годах в 50-х прошлого столетия, когда  компьютеры были не просто большими, а огромными. И появился из-за того, что машинное время было дорого, результаты расчетов выводились на бумагу (принтер, перфолента и т.д.), дело это по сравнению с вычислениями очень небыстрое, и процессор компьютера по сути простаивал. Ведь «прогоняемая» программа выводить на принтер не умеет…

И вот тут кому-то в голову пришла идея. Попробую объяснить это на пальцах.

Сидит человек, пиво пьет. И тут звонит телефон. Человек отвечает, общается, кладет трубку и пьет пиво дальше. Все просто, да.

А ведь это и есть прерывание. Ведь человек в процессе пития пива не проверяет ежесекундно, звонит телефон или нет. Но человек знает — звонит телефон — отложить текучку и ответить. Это — обработчик прерывания. Здесь важно то, что — ответив на звонок — человек возвращается к питью пива, а не идет чистить ботинки. Возвращается к тому, что делал до прерывания.

Как человек не проверяет постоянно — звонит ли телефон, свистит ли чайник на кухне и не пора ли в туалет — так и микроконтроллер в своей работе не проверяет, получили ли байт по последовательному каналу, отработал ли АЦП, появился ли сигнал на линии INT и  так далее — источников множество. Если бы прерываний не было — вся программа состояла бы из сплошных проверок — и основная, и все подпрограммы.

А на деле все обстоит так. Каждое событие — имеет свой вектор прерывания, который может указывать на процедуру обработчика. Еще микроконтроллер имеет средства разрешения — запрета — маскирования-приоритета прерываний, подробнее поясню позже.

Итак, возникает событие. Это событие — если разрешено — вызовет сохранение текущего указателя команд (что делаем) в стеке и переход на обработчик. Обработчик должен быть короткий, как тост, не изменять состояние процессора (если изменяет — сохранять при входе и восстанавливать при выходе). По окончании обработчика специальная команда возвращает управление туда, где прервалось. То есть процессор, по сути, ничего не замечает, ну разве что «пропало» некоторое процессорное время.

Если «по жизни» — то так. Человек пьет пьет пиво. Звонок — прерывание — берет трубу — принимает информацию — «Вася, я купила сапоги» — отмечает в своей таблице расходов — конец прерывания, кладет трубку, пьет пиво дальше.

Если по микроконтроллерному — прерывание USART Rx — идем в обработчик, байт данных кладем в буфер, модифицируем указатель, контроль переполнения опустим пока… Конец прерывания — программа работает дальше. Когда понадобится — она возьмет данные из буфера.

Закономерный вопрос — а вообще зачем? Понадобится программе — посмотрит в USART. Но буфер приема USARTа в лучшем случае 2 байта, а в некоторых МК вообще один. Принят следующий — если программа не прочитала предыдущий — он потерян.

 

nikolaew.org