![]() |
|
ОБСЛУЖИВАНИЕ ЗАПРОСОВ ПРЕРЫВАНИЙ ОТ ВНЕШНИХ И ВНУТРЕННИХ УСТРОЙСТВОбработка прерыванийМикроконтроллер должен обеспечивать управление прибором или устройством в реальном масштабе времени. Этому способствует схема управления прерываниями внутри микроконтроллера. Когда событие генерирует прерывание, центральное процессорное устройство (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, источники прерываний, номера векторов прерываний и приоритеты
Следующий код показывает один из способов запрета всех прерываний, за исключением прерывания EXTINT (приоритет 7) из подпрограммы обработки RI- прерывания (приоритет 9). SERIAL_RI_ISR:
Обратите внимание, что ячейка 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. Выполнение любого из следующих условий откладывает подтверждение прерывания до окончания выполнения следующей команды:
Время ожидания (для самого длительного случая) состоит из следующих элементов:
Максимальная задержка для стандартного прерывания - 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. |