
МП
.pdf
TIMER - работу таймера;
INTS - прерывания.
К этому же типу команд можно отнести упоминавшиеся ранее команды ENA SEC_REG и DIS SEC_REG активизации дополнительного банка регистров АЛУ, умножителя и сдвигателя.
if условие |
SET |
|
FLAG_OUT |
; |
|
RESET |
|
FL0 |
|
|
TOGGLE |
|
FL1 |
|
|
|
|
FL2 |
|
|
|
|
|
|
|
|
|
|
|
ENA |
|
BIT_REV |
; |
DIS |
|
TIMER |
|
|
|
INTS |
|
|
|
|
|
|
|
SEC_REG |
|
|
|
|
|
Рис. 16
10.Прерывания
Прерывания в общем виде являются средством заставить процессор прекратить выполнение текущей программы или подпрограммы, запомнить адрес возврата и перейти к выполнению другой подпрограммы,
ассоциированной с данным прерыванием, и являющейся частью общего для решаемой задачи прикладного программного обеспечения, по выполнении которой вернуться к продолжению выполнения прерванной программы.
Система прерываний процессора ADSP-2181 поддерживает прерывания от двенадцати источников, представленных в таблице 1 в порядке убывания приоритета.
51
|
|
|
Таблица 1 |
|
|
|
|
|
Вид |
Адрес |
|
|
прерывания |
|
|
|
|
|
|
1 |
RESET |
0x0000 |
Наивысший приоритет |
|
|
|
|
2 |
Power Down |
0x002C |
Немаскируемое |
|
|
|
|
3 |
IRQ2 |
0x0004 |
По низкому логическому уровню |
|
|
|
или по переходу из 1 в 0 |
|
|
|
|
4 |
IRQL1 |
0x0008 |
По низкому логическому уровню |
|
|
|
|
5 |
IRQL0 |
0x000C |
По низкому логическому уровню |
|
|
|
|
6 |
SPORT0 ПД |
0x0010 |
Передатчик пуст |
|
|
|
|
7 |
SPORT0 ПМ |
0x0014 |
Приемник полон |
|
|
|
|
8 |
IRQE |
0x0018 |
По переходу из 1 в 0 |
|
|
|
|
9 |
BDMA |
0x001C |
Окончание обмена |
|
|
|
|
10 |
SPORT1 ПД |
0x0020 |
Или IRQ1 |
|
|
|
|
11 |
SPORT1 ПМ |
0x0024 |
Или IRQ0 |
|
|
|
|
12 |
Таймер |
0x0028 |
Наинизший приоритет |
|
|
|
|
Каждым источником может быть сформирован запрос на прерывание,
устанавливающий соответствующий флаг; обслуживание запросов может быть разрешено или запрещено; общей командой DIS INTS запрещаются все прерывания, а запрет обслуживания конкретных прерываний (маскирование)
может быть реализован записью нулей в соответствующие разряды регистра
IMASK рисунок 17:
Регистр IMASK допускает обращение только на запись командой вида
IMASK = <записываемая комбинация>; и требует последующей команды
NOP;
52

Рис. 17
Если обслуживание данного прерывания не запрещено и процессор не занят обслуживанием прерываний равного или более высокого приоритета,
система прерываний внутренними аппаратными средствами сформирует вызов подпрограммы по адресу, фиксированному для данного прерывания и называемому вектором прерывания; при этом в стек будет автоматически записан адрес возврата.
Подпрограмма обслуживания прерывания должна обеспечить сохранность всех необходимых данных, если прерывающая программа использует те же регистры, что и прерываемая, поэтому обычно в начале прерывающей программы размещается фрагмент сохранения содержимого используемых регистров, а в конце - их восстановление. Заканчиваться подпрограмма прерываний должна командой RTI, по которой из стека в счетчик команд перегружается, аналогично команде RTS, адрес возврата, и в дополнение к этому снимается блокировка прерываний и сбрасывается флаг прерывания, если он запоминается процессором (см. далее).
Внешние прерывания IRQ0, IRQ1 и IRQ2 могут быть запрограммированы как уровневые (запрос на прерывание формируется, если уровень логического сигнала на входе равен 0) или как краевые (сигнал на
53

входе переходит из состояния логической единицы в логический 0) в
соответствии с комбинацией битов, записанной в регистра ICNTL рисунок
18; там же показано управление вложением прерываний.
Рис. 18
Так, если бит 4 регистра ICNTL установлен в 0, прерывающая подпрограмма более высокого приоритета не сможет «перебить» выполняемую подпрограмму более низкого приоритета.
Запрос на краевое прерывание запоминается и, если он поступает в момент времени, когда данное прерывание запрещено или не может быть обслужено, может быть обслужен позже, когда прерывание будет разрешено или возможно (и даже будет обслужен, если не принять мер по сбросу соответствующего флага в регистре IFC в соответствии с рис. 19, если его обслуживание в этом случае не требуется). Установленный запрос на прерывание автоматически сбрасывается при его обслуживании, поэтому нет необходимости предпринимать аппаратные или программные средства защиты от повторного ложного обслуживания краевых прерываний.
Процессор предоставляет возможность программной имитации поступления запроса на прерывание его однократным принудительным форсированием установкой соответствующего бита в регистре IFC.
54

Рис. 19
Аналогично регистру IMASK, регистр IFC допускает обращение только на запись командой вида
IFC = <записываемая комбинация>;
и требует последующей команды
NOP;
В уровневом режиме прерываний запрос не запоминается и пропадает,
если приходит и снимается в то время, когда прерывания запрещены. При использовании уровневого режима прерываний микропроцессорная система должна оснащаться внешней схемой, обеспечивающей снятие запроса на прерывание при его обслуживании; в противном случае процессор будет циклически выполнять прерывающую программу до тех пор, пока запрос не
55
будет снят. Это свойство уровневого режима, естественно, осложняет его применение, однако позволяет при использовании несложной внешней логики осуществить расширение входа прерывания для использования с многими внешними источниками.
Прерывания принято разделять на внешние и внутренние; эта классификация относится к периферии, инициирующей запросы на прерывания.
По отношению к ходу выполнения программы все прерывания являются внешним воздействием. Внешний характер прерываний по отношению к ходу выполнения программы следует понимать в том смысле,
что программа не содержит команд вызова прерывающих подпрограмм и момент возникновения необходимости их выполнения не известен программисту.
К внутренним относятся прерывания, инициируемые резидентными периферийными устройствами процессора (расположенными на кристалле).
Для процессора ADSP-2181 к внутренним относятся прерывания последовательного порта SPORT0 ПД (адрес 0х10), SPORT0 ПМ (адрес
0х14), SPORT1 ПД (адрес 0х20), SPORT1 ПМ (адрес 0х24), прерывание окончания обмена по шине BDMA (адрес 0х1С) и таймерное прерывание
(адрес 0х28).
Остальные прерывания относятся к внешним; каждому из них соответствует одноименный вывод (ножка микросхемы) процессора,
воздействие на которые со стороны каких-то внешних цепей может инициировать запрос на прерывание.
Имеется одна технологическая тонкость разработки программ,
использующих прерывания. Область памяти программ с нулевого адреса по адрес 0х2F включительно, содержащая ячейки памяти, закрепленные за конкретными типами прерываний (вектора прерываний, см. таблицу 1),
называется таблицей векторов прерываний и не может быть использована
56
для других целей.
На каждый вид прерываний в пределах таблицы отводится по 4 ячейки.
Если подпрограмма обслуживания прерываний короткая и содержит не более трех команд, она может быть размещена непосредственно в тех ячейках,
которые отведены для данного прерывания. Например, для прерывания
BDMA подпрограмма изменения направления передачи может быть размещена в ячейках 0х1С, 0х1D, 0х1Е, а по адресу 0x1F размещена команда возврата из прерывающей подпрограммы rti.
Если же размер прерывающей подпрограммы больше трех команд, то обычно в первой ячейке, отведенной для данного вида прерывания, – его вектора, – размещается команда безусловного перехода к началу прерывающей подпрограммы, а остальные три ячейки занимаются командой
rti.
В любом случае все неиспользуемые ячейки векторов прерываний от нулевого адреса по адрес 0х2F включительно должны быть заполнены командой rti.
11. Реализация программ, использующих внешние прерывания.
Активным сигналом внешних прерываний обычно является низкий логический уровень (логический 0) или фронт перехода от высокого логического уровня к низкому (спад). Инверсный характер сигнала выбирается для предотвращения ложных прерываний в случае нарушения контакта между формирующей запрос внешней цепью и соответствующим входом процессора. Следует помнить, что брошенный «в воздухе» вход воспринимается логической микросхемой как логическая единица (если не предприняты специальные меры по обеспечению его низкого уровня).
Реализацию программ, использующих внешние прерывания, удобно рассматривать на примере.
Использование внешних прерываний предполагает подключение к
57

соответствующим входам процессора некоторых внешних аппаратных средств. Наиболее простым в теоретическом и наиболее сложным в практическом смысле видом таких средств является обычный механический контакт, в практике часто называемый «сухим».
В качестве примера рассмотрим принцип построения программы,
использующий прерывания от двух кнопок (типа «сухой контакт»),
подключенных к входам процессора IRQ2 и IRQE в соответствии с рис.20.
Разомкнутое состояние кнопки соответствует пассивному состоянию входа прерываний (высокий логический уровень), а замыкание контакта переводит состояние входа в низкий логический уровень.
Рис. 20
Текст программы должен содержать следующие части:
-объявление переменных (реализуется псевдоинструкциями ассемблера);
-программирование прерываний (реализуется в основной программе);
-подпрограммы, исполняемые при нажатии KN1 и KN2 (реализуется
вформе прерывающих подпрограмм).
Как известно, механическим контактам свойственен эффект,
заключающийся |
в |
многократном |
переходном |
процессе |
типа |
включения/выключения |
при замыкании, |
длительность |
которого |
может |
|
|
|
58 |
|
|
|
достигать сотен микросекунд (и даже единиц миллисекунд), получивший название дребезга контакта. Подключение сухих контактов к быстродействующим процессорам, как это показано на рис. 20, будет приводить к многократным срабатываниям механизма прерываний. Для предотвращения многократных срабатываний обычно используются аппаратные или программные средства противодребезга. В рассматриваемом примере предлагается реализация программного обеспечения противодребезга, функция которого заключается в игнорировании повторных запросов в течение 1.5 мс после возникновения первого и сброс новых запросов, возникших в процессе выполнения прерывающих подпрограмм.
Блок-схема алгоритма, реализующего функцию противодребезга представлена на рис. 21.
Этот алгоритм не претендует на оптимальность; он призван обратить внимание разработчика на необходимость учета всевозможных привходящих условий.
Подпрограмма начинается с сохранения значений используемых регистров, поскольку, как отмечалось ранее, момент возникновения запроса на прерывание непредсказуем и изменение содержимого любого регистра может по возвращении в прерванную программу привести к нарушению правильности ее работы.
Следующие три блока организуют функцию противодребезга задержкой на дальнейшее исполнение на 1.5 мс.
После выполнения подпрограммы, ассоциированной с замыканием контакта (нажатием кнопки) необходимо восстановить значения использованных в подпрограмме регистров и сбросить запрос на это прерывание (на предмет возможности его возникновения в процессе выполнения подпрограммы).
59

Рис. 21
Для реализации счетчиков для контактов KN1 и KN2 в памяти данных процессора должны быть отведены две ячейки; соответствующие им переменные назовем kn1_cnt и kn2_cnt.
Для организации счетчика будет достаточным использование только одного регистра AR; для сохранения его значения в разных подпрограммах
60