ОБСЛУЖИВАНИЕ ЗАПРОСОВ ПРЕРЫВАНИЙ ОТ ВНЕШНИХ И ВНУТРЕННИХ УСТРОЙСТВ

Обработка прерываний

Микроконтроллер должен обеспечивать управление прибором или устройством в реальном масштабе времени. Этому способствует схема управления прерываниями внутри микроконтроллера. Когда событие генерирует прерывание, центральное процессорное устройство (CPU) обслуживает его перед выполнением следующей команды.

Рис. 9.1 Блок-схема обработки стандартных прерываний и прерываний PTS микроконтроллером 8XC196KC/KD

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

8XC196KC/KD обеспечивает два варианта обслуживания прерываний:

1) подпрограммами обработки программного прерывания через программируемый контроллер прерываний (PIC) ;

2) микропрограммами обработки аппаратного прерывания через сервер периферийных транзакций (PTS).

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

На рис. 9.1 представлена последовательность обработки прерываний.

Transition Detected - поступление прерывания;

Set Int.Pending Bit - установка бита захвата прерывания;

NMI Pending Bit - бит захвата немаскируемого прерывания;

Int.Mask Bit - бит маскирования прерывания;

PTS Select Bit - бит выбора PTS;

Global Int./PTS Enable - глобальное разрешение обслуживания прерываний PIC или PTS;

Priority Encoder - приоритетный шифратор;

NMI - немаскируемое прерывание (Non-Maskable Interrupt);

Any PTS Request - любой запрос прерывания PTS;

Highest Priority - наивысший приоритет;

Vector Table - таблица векторов;

Interrupt Service Routine - подпрограмма обслуживания прерывания;

PTS Control Block - блок управления PTS.

Функционирование контроллера прерываний

Контроллер прерываний обслуживает прерывания посредством подпрограмм обработки прерываний. Когда аппаратные средства обнаруживают прерывание, PIC генерирует и выполняет специальный вызов по прерыванию. PIC помещает содержимое программного счетчика (Program Counter, PC) в стек и затем загружает PC содержимым соответствующего вектора прерывания.

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

Функционирование сервера периферийных транзакций

Сервер периферийных транзакций - микропрограммный драйвер аппаратного прерывания. Он может использоваться вместо стандартной подпрограммы обработки прерывания для каждого из маскируемых прерываний. PTS обслуживает прерывания с меньшим количеством непроизводительных затрат; он не изменяет стек и PSW, что позволяет продолжаться нормальному потоку команд.

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

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

PTSCB определяет режим, общее число передач (если необходимо), общее число циклов, которые будут выполнены перед тем, как прерывание PTS будет обслужено, и источник и/или приемник передачи данных (если необходимо). Каждое прерывание PTS генерирует один цикл PTS. На рис. 9.2 приведен алгоритм цикла PTS.

Рис. 9.2. Блок-схема цикла PTS

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

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

Приоритет поступившего прерывания относительно всех других отложенных запросов прерывания определяет приоритетный шифратор. В таблице 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 низкого уровня) и защелкивает прерывание, когда происходит переход от низкого уровня сигнала к высокому. Для того, чтобы гарантировать распознавание, вход прерывания должен удерживаться на высоком уровне сигнала дольше, чем одно временное состояние. Если ширина импульса - точно одно временное состояние или меньше, существует статистическая возможность того, что прерывание может быть пропущено.

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

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

Время ожидания прерывания

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

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

Когда подтверждается прерывание PTS, обращение к PTSCB идет немедленно и начинает выполняться цикл PTS.

Выполнение любого из следующих условий откладывает подтверждение прерывания до окончания выполнения следующей команды:
- знаковый префиксный код операции (FE) для двухбайтового знакового умножения и деления;
- прерывание по невыполняемому коду операции;
- прерывание по программной ловушке;
- любая из следующих защищенных команд: DI, EI, DPTS, EPTS, POPA, POPF, PUSHA, PUSHF.

Время ожидания (для самого длительного случая) состоит из следующих элементов:
- время для окончания выполнения текущей команды (4 такта);
- если это защищенная команда, то следующая за ней команда должна выполниться раньше, чем прерывание может быть подтверждено. Поэтому следует добавить еще и время выполнения команды, которая следует за защищенной;
- время выполнения следующей команды (самая длинная команда NORML занимает 39 тактов);
- только для стандартных прерываний - время получения вектора и обращения к подпрограмме (11 тактов для внутреннего стека или 13 - для внешнего).

Максимальная задержка для стандартного прерывания - 56 тактов (4+39+13). Это время задержки не включает время, необходимое для выполнения первой команды в подпрограмме обработки прерывания.

Максимальная задержка для прерывания PTS - 43 такта (4+39). Это время задержки не включает дополнительную задержку при отключении PTS (PSW.2=0) или при обслуживании PTS c более высоким приоритетом.

Специальные прерывания

8XC196KC/KD поддерживает три специальных прерывания: несуществующий код операции (Unimplemented Opcode), программную ловушку (TRAP) и NMI. На эти прерывания не воздействует бит разрешения прерывания PSW.1 (I), и они не могут маскироваться. Все эти прерывания обслуживаются контроллером прерывания; они не могут быть назначены для обработки PTS.

Из этих трех только NMI идет через детектор перехода и приоритетный шифратор, а другие два специальных прерывания идут непосредственно для обслуживания в контроллер прерывания.

Прерывание по несуществующему коду операции

Если CPU пытается выполнить несуществующий код операции, происходит косвенное обращение по вектору в ячейке 2012H. Это предотвращает произвольное выполнение программ во время отказов программного обеспечения и аппаратных средств.

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

Прерывание по ловушке программного обеспечения

Команда TRAP (код операции 0F7H) выполняет вызов прерывания по вектору в ячейке 2010H. Она выполняет прерывание одиночной команды, которое используется при отладке программного обеспечения или при генерации программных прерываний. Команда TRAP запрещает подтверждение других прерываний, пока не выполнится следующая команда.

Немаскируемое прерывание

Внешний вывод NMI генерирует немаскируемое прерывание для реализации критических подпрограмм прерывания.

Прерывание NMI имеет самый высокий приоритет относительно всех располагаемых по приоритетам прерываний. Оно идет непосредственно от детектора перехода к приоритетному шифратору и оттуда к подпрограмме по вектору в ячейке 203EH.

Прерывание NMI генерируется в течение фазы 1 (CLKOUT=0). Если вывод удерживается в высоком состоянии, многократные прерывания не будут происходить. Если ваша система не использует прерывание NMI, то для предотвращения ложных прерываний заземлите вывод NMI. Хотя в регистре INT_MASK1 существует бит маскирования NMI, однако он не выполняет никакой функции; прерывание NMI разрешено и при установленном, и при сброшенном бите NMI в регистре INT_MASK1. Чтобы гарантировать совместимость с будущими изделиями (программами), всегда сбрасывайте на нуль бит маскирования прерывания NMI.

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