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