Приоритеты прерываний

Прерывания по несуществующему коду операций и ловушкам не различаются по приоритетам, они идут для обслуживания непосредственно в контроллер прерываний. Контроллер прерываний выбирает соответствующую ячейку вектора в памяти специального назначения. Вектор содержит начальный адрес подпрограммы обработки прерывания.

Приоритет поступившего прерывания относительно всех других отложенных запросов прерывания определяет приоритетный шифратор. В таблице 9.1 приведены приоритеты прерываний по умолчанию (15 - самый высокий и 1 - самый низкий).

Немаскируемые прерывания (NMI) имеют самый высокий приоритет относительно всех располагаемых по приоритетам прерываний. Если NMI отложено, приоритетный шифратор выбирает его как самый высокий приоритетный запрос и контроллер прерываний выбирает соответствующую ячейку вектора в памяти специального назначения.

Любой запрос прерывания PTS имеет более высокий приоритет, чем все маскируемые стандартные запросы прерывания. Если никакой запрос NMI не отложен, приоритетный шифратор определяет, что самый высокий приоритет имеют запросы PTS и контроллер прерываний выбирает соответствующую ячейку вектора PTS в памяти специального назначения. Вектор содержит начальный адрес соответствующего управляющего блока PTS (PTSCB).

Если никакие запросы NMI или PTS не отложены, приоритетный шифратор определяет самый высокий приоритет стандартным запросам прерывания и контроллер прерываний выбирает соответствующую ячейку вектора в памяти специального назначения. Вектор содержит начальный адрес соответствующей подпрограммы обработки прерывания.

Изменение приоритетов прерываний

Программное обеспечение может изменять приоритеты по умолчанию для маскируемых прерываний, управляя регистрами маски прерываний (INT_MASK и INT_MASK1, см. Приложение). Например, Вы можете определить тип прерывания, проверить, есть ли оно вообще, можете прервать подпрограмму обработки прерывания или цикл PTS.

Таблица 9.1

8XC196KC/KD, источники прерываний, номера векторов прерываний и приоритеты

Номер прерыванияВектор прерыванияИсточник (источники)Номер вектора прерыванияНомер PTS вектораПриоритет
SpecialUnimplemented OptcodeUnimplemented Optcode2012H--
SpecialSoftware TrapTRAP Instruction2010H--
INT15NMI (2)NMI203EH-15
INT14HSI FIFO FullHSI FIFO Full803CH805CH14
INT13EXTINT1(2)P2.2803AH805AH13
INT12Timer 2 OverlowTimer 2 Overlow8038H8058H12
INT11Timer 2 Capture (2)Timer 2 Capture8036H8056H11
INT10HSI FIFO 4HSI FIFO Fourth Entry8034H8054H10
INT09ReceivePI Flag (3)8032H8052H9
INT08TransmitTI Flag (3)8030H8050H8
INT07EXTINT (2)P2.2 or P0.7800EH804EH7
INT06Serial PortRI Flag and TI Flag (4)800CH804CH6
INT05Software TimerSoftware Timer 0-3 Timer 2 Reset800AH804AH5
INT04HSI.0 Pin (2)HSI.08008H8048H4
INT03High Speed OutputsHSO.0-HSO.58006H8046H3
INT02HSI Data AvaitableHSI FIFO Full or HSI Holding reg. Loaded8004H8044H2
INT01A/D Conversion CompleteA/D Conversion Complete8002H8042H1
INT00Timer OverflowTimer 1 or Timer 28000H8040H0
Каждое следующее маскируемое прерывание может быть обслужено PTS. Любое прерывание PTS имеет приоритет выше всех других маскируемых прерываний.

Следующий код показывает один из способов запрета всех прерываний, за исключением прерывания EXTINT (приоритет 7) из подпрограммы обработки RI- прерывания (приоритет 9).

SERIAL_RI_ISR:

pusha; Сохранить PSW, INT_MASK, INT_MASK1 и WSR
di; Отключить все прерывания
ldb int_mask1, #00100000B; Разрешить только прерывание EXTINT
ei; Разрешить обслуживание прерываний
...; Подпрограмма обслуживания прерывания по приему
...; (RI)
...;
popa; Восстановить PSW, INT_MASK, INT_MASK1 и WSR
ret 

Обратите внимание, что ячейка 8032H в таблице векторов прерываний должна загружаться значением метки SERIAL_RI_ISR раньше, чем придет запрос прерывания по приему RI (Receive Interrupt) и, кроме того, для выполнения этой подпрограммы прерывание должно быть разрешено.

Программы обработки прерываний

Все подпрограммы обслуживания прерываний 8XC196KC/KD обрабатываются следующим образом.

1. После того, как аппаратные средства обнаружат и определят приоритет запроса прерывания, они генерируют и выполняют специальный вызов по прерыванию. Вызов обслуживания прерывания помещает счетчик программ в стек и затем загружает его содержимым вектора, соответствующего самому высокому приоритету, задерживая немаскированные прерывания. Аппаратные средства не позволят выполнить другой вызов по прерыванию, пока не выполнится первая команда подпрограммы обработки текущего прерывания.

2. Команда PUSHA сохраняет содержимое PSW, INT_MASK, INT_MASK1 и регистра выбора окна (WSR) в стеке и затем очищает PSW, INT_MASK и INT_MASK1.

Кроме арифметических флагов PSW содержит бит глобального разрешения прерываний (I) и бит разрешения PTS (PSE). Очищая PSW, INT_MASK и INT_MASK1 регистр, команда PUSHA маскирует все маскируемые прерывания, отключает стандартное обслуживание прерываний и PTS.

Команда PUSHA также запрещает вызовы по прерыванию, пока не выполнится следующая команда .

3. Команда LDB INT_MASK1, #xxxxxxxxB допускает те прерывания, которые могут прервать текущую подпрограмму обработки прерываний. В примере, приведенном выше, только EXTINT может прервать подпрограмму обработки прерывания по приему.

Разрешая или запрещая обслуживание прерываний, программное обеспечение устанавливает собственное обслуживание приоритетов прерываний.

4. Команда EI повторно разрешает обработку прерывания и запрещает вызовы по прерыванию, пока не выполнится следующая команда.

5. Фактически подпрограмма обработки прерывания выполняется внутри приоритетной структуры, установленной программным обеспечением.

6. В конце обслуживающей подпрограммы команда POPA восстанавливает первоначальное содержание PSW, INT_MASK, INT_MASK1 и WSR регистров. Любые изменения, сделанные в этих регистрах в течение подпрограммы обработки прерывания, не сохраняются. Так как вызовы по прерыванию не могут происходить сразу после команды POPA, последняя команда (RET) будет выполнена раньше, чем придет другой вызов по прерыванию. После своего выполнения команда POPA будет повторно допускать отложенное прерывание. Если контроллер прерывания обслуживал отложенное прерывание перед выполнением команды RET, то адрес возврата к коду, который выполнялся, когда произошло первоначальное прерывание, будет сохранен в стеке. Это не представляет проблему для потока программы, зато может приводить к переполнению стека, если прерывания происходят с высокой частотой.

Обратите внимание, что "преамбула" и код завершения для подпрограммы не сохраняют и не восстанавливают регистров оперативной памяти. Подпрограмма обработки прерывания должна сама определить собственный частный набор регистров из нижнего регистрового файла. Доступность 232 байтов оперативной памяти в нижнем регистровом файле позволяет делать это совершенно свободно. Кроме того, оперативная память доступна в верхнем регистровом файле через работу с вертикальными окнами.

Распознование прерываний

Пять внешних источников могут прерывать работу 8XC196KC/KD. Детектор перехода производит выборку входов прерывания в течение фазы 1 (CLKOUT низкого уровня) и защелкивает прерывание, когда происходит переход от низкого уровня сигнала к высокому. Для того, чтобы гарантировать распознавание, вход прерывания должен удерживаться на высоком уровне сигнала дольше, чем одно временное состояние. Если ширина импульса - точно одно временное состояние или меньше, существует статистическая возможность того, что прерывание может быть пропущено.

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

Обратите внимание: в то время, когда входной вывод удерживается в высоком состоянии, логика обнаружения прерывания может сгенерировать прерывание, если произойдет мгновенный отрицательный импульс. По этой причине входы прерывания, когда они не активны, должны находиться в низком состоянии.

<<< Содержание >>>