Микропроцессоры и микроконтроллеры

 
 
 
«Анализ компьютерных систем — это как воспитание детей; можно нанести огромный вред, но нельзя гарантировать успех.»
Tom DeMarco
Русский | Українська


Микропроцессоры и микроконтроллеры :: Принципы программирования MSC-51 :: Работа системы обслуживания прерываний

Работа системы обслуживания прерываний

Флаги прерываний опрашиваются в момент S5P2 каждого МЦ. Ранжирование прерываний по уровню приоритета выполняется на протяжении следующего МЦ, и выбирается прерывание, которое необходимо обслужить в данный момент.

Система прерываний формирует аппаратно команду вызова LCALL и загружает ее в регистр команд IR. Один из адресов векторов перехода на процедуру обработки прерывания используется как адрес вызова (рис.16.2 или рис.29 в комплекте). Вектора перехода образуют участки по восемь байт в памяти программ. На этих участках могут находиться:

-         команда JMP перехода на соответствующую процедуру обработки прерывания или команды условных переходов на несколько процедур (например, для УАПП - по TI или RI);

- короткая (до восьми байтов) процедура обслуживания прерывания.

Например: пусть зафиксирован запрос прерывания от TF1. Логика передачи управления показана схемой на рис.16.5 или рис.30 в комплекте.

Процедура обработки прерывания обычно начинается командами PUSH для сохранения в стеке важной информации из регистров (PSW, ACC, DPRT и т.д.), а завершается восстановлением из стека их содержимого (команды POP) в обратном порядке. Последней является команда RETI, по которой в (РС) загружается сохраненная точка возврата в основную программу и снимается блокировка прерывания только что обслуженного уровня. Таким образом, внутри процедуры обработки прерывания не может обслуживаться прерывание, которое вызвало данную процедуру (разумеется, в случае его появления).

В случае, если необходимо обрабатывать сигналы внешних прерываний от нескольких источников (больше двух), можно воспользоваться простой схемой (рис.16.6). В соответствии с ней, при возникновении запроса на прерывание от любого устройства (даже от нескольких одновременно!) будет сформирован единый запрос на входе #INT1. Процедура обработки этого общего запроса должна программным путем провести опрос всех входов Р1.0...Р1.3, определить устройство (или устройства), которое сделало вызов, выбрать источник с высшим приоритетом и провести соответствующую обработку события, которое вызвало прерывание основной программы.

Таким образом, подобная схема требует реализации протокола обработки прерывания с программным поиском источника. (Студентам предлагается самостоятельно разработать программный фрагмент реализации такого протокола).