I
і
МИКРОКОНТРОЛЛЕРЫ
I
работы прерванной программы просто
выполнить команду возврата
rts,
но на
самом деле для возврата из программ-
обработчиков вместо команды
rts
ис-
пользуется ее специальный вариант,
с которым мы еще не встречались, -
cmpl
%а0,10
jz
$1
команда
rti.
Что это за команда и чем
она отличается от команды
rts?
Вернемся немного назад - туда,
где была описана работа механизма
прерываний. Обратите внимание еще
раз - проверка сигналов аппаратурой
микроконтроллера выполняется после
каждой
команды программы. Эго зна-
чит, что прерывание может произойти
в
абсолютно любом
месте програм-
мы. Например, если в нашей програм-
ме есть фрагмент кода:
; Проверить величину переменной
; Величина=10 - переход на обработку этого случая.
то, в принципе, ничто не мешает прерыванию возникнуть после команды
стр і,
т.е. этот кусок кода выполнится
процессором как:
1
; Проверить величину переменной
; А вот Здесь возникло прерывание!
; Величина=10 - переход на обработку этого случая.
cmpl
%а0,10
jsr
interrupt
jz
$1
Если же в обработчике прерыва-
ния будут выполнены какие-либо ко-
манды, изменяющие флаги регист-
ра состояния процессора - а такие
команды
почти наверняка
в обра-
ботчике прерываний окажутся! - то
после возврата из обработчика пре-
рываний содержимое регистра со-
стояний будет описывать уже не ре-
зультат сравнения ячейки
%а0
и чис-
ла 10, а все, что угодно! В результа-
те из-за возникновения неожиданно-
го прерывания вся логика работы
программы окажется полностью раз-
рушенной. Вот для того, чтобы это-
го не случилось, при обработке пре-
рываний процессор не только запи-
сывает в стек адресов возврата ад-
рес команды, на которую необходи-
мо вернуться (в нашем примере это
- адрес команды
jz $1),
но и сохра-
няет в
стеке данных
содержимое
регистра состояний.
И сразу - не-
большое отступление: такой меха-
низм реализован далеко не во всех
выпускаемых в мире микроконтрол-
лерах, в некоторых программисту
приходится в явном виде заботить-
ся о том, чтобы сохранять регистр
состояния. Соответственно этому,
при выполнении команды
rti,
она не
только возвращает управление на
команду
jz $1
(в нашем примере), но
и
восстанавливает
содержимое ре-
гистра состояний из стека данных.
В таком случае после выполнении ко-
манды
rti
регистр состояния вернет-
ся точно в то состояние, в котором
он был после выполнения команды
cmpl,
и программа вообще “не заме-
тит”, что ее выполнение прерывалось!
38
|
----------
Итак, возвращаться из обработчика
прерываний можно
только командой
rti.
И сразу же - еще один вывод: при
использовании в программе механиз-
ма прерываний глубина вложенности
подпрограмм
не должна превышать
7
(а не 8!), а глубина стека данных -
15
(а не 16!), потому что по одному
(как минимум!) элементу из стека дан-
ных и адресов возврата могут в лю-
бой момент использовать обработчи-
ки прерываний.
Можно ли управлять моментом
обработки прерываний, ведь преры-
вание, как было сказано, может воз-
никнуть в любом месте программы?
Да, можно, и вот каким образом.
Начать нужно с того, что в мик-
роконтроллере в регистре состояний
существует специальный бит разре-
шения работы механизма прерыва-
ний (флаг IE). При включении или
сбросе микроконтроллера этот бит
автоматически сбрасывается, зап-
рещая тем самым работу механиз-
ма прерываний. Сделано это для
того, чтобы в момент включения,
когда в программе еще не выполне-
ны необходимые настройки портов,
таймеров и проч., посторонние сиг-
налы не мешали работе. Если меха-
низм прерываний необходимо вклю-
чить, следует установить этот бит в
лог.1. Делается это командой
sst
(она очень похожа по принципу ра-
боты на команду
bisl).
Если же сбро-
сить этот бит в лог.О (для этого су-
ществует команда
est),
то работа
механизма прерывания вновь будет
заблокирована. Указанный бит раз-
решения действует, однако, не на
все прерывания: прерывания от сто-
рожевого таймера и от сигнала пе-
реполнения (переопустошения) сте-
ков будут возникать независимо от
того, установлен ли этот бит или
сброшен. Эти два прерывания назы-
ваются
немаскируемыми
(посколь-
ку на их возникновение не действу-
ет бит разрешения прерываний), а
все остальные прерывания - соот-
ветственно
маскируемыми.
Такое
исключение для немаскируемых
прерываний сделано из-за того, что
они возникают при серьезных ошиб-
ках в программе (например, при “за-
цикливании” программы или попыт-
ке сохранить в стеке данных боль-
ше, чем он может вместить), и про-
грамма обязательно должна полу-
чить сигналы о таких серьезных
ошибках! Итак, бит разрешения пре-
рываний разрешает или запрещает
работу механизма прерываний для
всех маскируемых прерываний,
у
Для того, чтобы разрешить или
запретить возникновение того или
иного сигнала прерывания
индиви-
дуально,
используются соответству-
ющие биты в управляющих регистрах
внешних устройств микроконтролле-
ра. Такой бит есть в управляющем
регистре интервального таймера
(разрешает “звонок” от интервально-
го таймера, если содержимое счет-
ного регистра интервального тайме-
ра совпало с содержимым регистра
интервала). Такой бит имеется в уп-
равляющем регистре ЭСППЗУ (раз-
решает прерывание по окончанию
операции записи в ЭСППЗУ), и в уп-
равляющих регистрах портов А и В
I Родиолюбитель - 1
1
/2 0 0 5
предыдущая страница 36 Радиолюбитель 2005-11 читать онлайн следующая страница 38 Радиолюбитель 2005-11 читать онлайн Домой Выключить/включить текст