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

 
 
 
«Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.»
Brian W. Kernighan.
Русский | Українська


Микропроцессоры и микроконтроллеры :: Принципы программирования 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, определить устройство (или устройства), которое сделало вызов, выбрать источник с высшим приоритетом и провести соответствующую обработку события, которое вызвало прерывание основной программы.

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