fl
"РЛ" - НАЧИНАЮЩИМ
и
-
приоритетов при помощи регистра приоритетов IP, который
условно показан в
таблице 14.
Флаги
РХО
и
РХ1
задают уровень приоритета для вне-
шних запросов INTO и INT1 соответственно,
РТО, РТ1
и
Р Т2-
уровни запросов от таймеров №0, .1 и 2 соответственно, ну, а
PS - от последовательных интерфейсов UART и SPI-.Если
соответствующий бит в регистре IP установлен, то приори-
тет данного запроса становится выше, чем приоритет любо-
го иного запроса, для которого бит в IP сброшен. Для запро-
сов, у которых значения битов IP одинаковы, приоритет оп-
ределяется фиксированным уровнем. Поясню зто следую-
щим образом: приоритет запроса от UART - один из самых
низких, но если мы установим флаг PS, то от его приоритет
станет самым высоким (при условии, что остальные биты
регистра !Р сброшены).
После сброса регистр IP содержит нулевое значение,
т.е. пользовательские приоритеты не заданы.
Уточненный с учетом приоритетов алгоритм реакции на
запросы прерываний следующий: при обнаружении запроса
прерывания производится анализ IE, если соответствующий
запрос разрешен, то проверяется, идет ли уже обработка
прерывания и, если да, то приоритет поступившего запроса
сравнивается с приоритетом уже обрабатываемого, и толь-
ко если приоритет поступившего выше, происходит форми-
рование команды LCALL обычным образом.
Теперь вам должно быть понятно, зачем для возврата из i
прерывания требуется специальная команда - она застав-
ляет устройство управления разрешить обработку прерыва-
ний того же уровня, что только что обработанное. Если ис-
пользовать RET для возврата из обработчика прерывания,
то работа системы прерываний будет нарушена и порядок
обработки последующих запросов будет неверным. Честно
говоря, поведение микроконтроллера в этом случае
точно
мне неизвестно, да и в фирменной документации подобный
вариант не рассматривается, так что просто всегда посту-
пайте правильно ©.
. Итак, подведем итоги. Прерывание - зто реакция на оп-
ределенное событие-запрос. Запрос может поступать от лю-
бого встроенного устройства микроконтроллера или отвнеш-
него источника. Каждый запрос имеет фиксированный и на-
значаемый пользователем уровни приоритета. При одновре-
менном поступлении двух запросов первым будет обрабо-
тан тот, приоритет которого выше. Обработка менее приори-
тетного запроса может быть прервана более приоритетным.
Обрабатываются только те запросы, для которых установ-
лен флаг разрешения в регистре IE, и то при условии, что
имеется общее разрешение прерываний флагом ЕА. После
; возврата из обработчика прерывания обязательно выпол-
няется одна команда прежде, чем начинается обработка но-
вого поступившего запроса.
Остается разобраться с векторами прерываний. Соб-
ственно, само понятие вектора особых пояснений не требу-
ет - это обычный адрес команды в памяти программ. А вот
значение каждого вектора, называемое также точкой входа
в обработчик прерывания, - штука важная, на ней и остано-
вимся.
Для каждого вектора выделен определенный фиксиро-
ванный адрес в сегменте кода, согласно
таблице 15.
Таблица 15.
Таблица стандартных векторов прерываний
Источник запроса
Адрес вектора (точка входа)
Сброс микроконтроллера
оооон
Внешний запрос 0
0003h
Запрос от таймера
0
,
000Bh
Внешний запрос 1
0013h
Запрос от таймера 1
001 Bh
Запрос от последовательных интерфейсов
0023h
Запрос от таймера 2 и внешний запрос 2
002Bh
Эта таблица показывает, что точка входа в обработчик
любого прерывания строго фиксировала. Внимательно по-
смотрев на таблицу векторов можно понять, что места для
нормальной обработки запроса имеется очень мало - всего
8 байт. Кое-какие микро-обработчики можно втиснуть и в
такой объем, но обычно поступают иначе: по адресу вектора
помещают команду безусловного перехода на полноценный
обработчик. Если какое-либо прерывание не используется в
вашей программе, вы смело можете размещать в области
его вектора свои собственные данные или коды, хотя необ-
ходимость так поступать возникает крайне редко.
В свете сказанного “шаблонное” начало сегмента кода
программы выглядит примерно так:
CSE6
ORG
0
JMP
Begin
; начало программы по сбросу
; микроконтроллера
ORG
ОООЗЬ
JMP
ExtlntO
; обработчик внешнего запроса 0
ORG
ОООВЬ
JMP
TimerOInt ; обработчик запроса .от таймера 0
; и так далее до последнего используемого вектора
После такой “преамбулы” в произвольном порядке надо
написать соответствующие подпрограммы обработки запро-
сов. Если какой-то вектор не используется, то просто не нуж-
но указывать соответствующие ему директиву назначения
адреса и команду перехода. Кстати, константы адресов век-
торов можно описать директивами EQU, и тогда программа
станет еще более красивой.
Из приведенной таблицы следуют два вывода: сброс мик-
роконтроллера трактуется как прерывание и некоторые раз-
ные запросы прерываний обрабатываются одним общим об-
работчиком. Если первый вывод просто можно принять к све-
дению (или забыть о нем ©), то второй требует осмысления.
Ведь необходимо разобраться, что же именно делать в об-
работчике такого “совмещенного” прерывания, т.е. выяснить
фактический источник запроса. В этом нам помогает знание
работы системы прерываний: каждому отдельному запросу
обязательно
соответствует какй-либо флаг запроса, устанав-
ливаемый в одном из регистров специальных функций, а зна-
чит, достаточно лишь проанализировать эти флаги, чтобы
определить, какой именно источник вызвал прерывание.
Продолжение в №8/2007
Радиолюбитель - 0 7 /2 0 0 7
(J
45
предыдущая страница 45 Радиолюбитель 2007-07 читать онлайн следующая страница 47 Радиолюбитель 2007-07 читать онлайн Домой Выключить/включить текст