После того, как регистры будут сохранены в стеке, МК автоматически устанавливает глобальную маску прерывания I в 1, запрещая тем самым другие маскируемые прерывания. Бит маски внешнего прерывания по входу
также устанавливается в 1.
Поэтому подпрограмма прерывания не может быть прервана даже немаскируемым внешним прерыванием. Далее в программный счетчик центрального процессора автоматически загружается адрес начала подпрограммы прерывания. Этот адрес извлекается из ячеек памяти таблицы векторов прерывания. Выбор необходимого адреса внутри таблицы векторов осуществляется аппаратными средствами микроконтроллера. Этот адрес соответствует источнику обрабатываемого прерывания.
По завершении исполнения подпрограммы прерывания, МК восстанавливает регистры центрального процессора из стека, включая программный счетчик PC, сбрасывает биты масок I и X в регистре CCR. Таким образом, в МК восстанавливается состояние центрального процессора, которое было до исполнения подпрограммы прерывания. И процесс выполнения фоновой программы возобновляется. В исходном тексте подпрограммы прерывания для ее корректного завершения записывается команда возврата из прерывания RTI. Именно эта команда реализует действия по восстановлению регистров из стека и сбросу масок прерывания. Обратите внимание, в начале подпрограммы прерывания для выгрузки регистров в стек и установки масок I и X не требуется команд. А для выполнения обратных действий программист должен воспользоваться командой RTI. При написании программы на Си подпрограмма прерывания оформляется как функция. При этом если объявлено, что функция является подпрограммой прерывания, то команда ассемблера RTI подставляется в исходный текст автоматически. Мы рассмотрим процесс составления исходного текста программы с прерываниями на Си в следующем параграфе.
Вопросы для самопроверки
1. В приведенном списке перечислены действия МК в процессе перехода к подпрограмме прерывания. Укажите, какие действия выполняются аппаратными средствами МК, а какие требуют написания соответствующего кода в управляющей программе.
• Инициализация таблицы векторов прерываний (программист);
• Инициализация указателя стека (программист);
• Разрешение прерываний в системе (программист);
• Завершение выполнения текущей команды (МК);
• Обнуление регистров конвейера команд (МК);
• Вычисление адреса возврата в основную программу (МК);
• Запоминание состояния регистров в стеке (МК);
• Установка в 1 бита I (МК);
• Загрузка из памяти вектора прерывания с максимальным приоритетом (МК);
• Передача управления подпрограмме прерывания (МК);
• Сброс сигнала запроса обслуживаемого прерывания (программист или МК, в зависимости от источника прерывания);
• Восстановление регистров центрального процессора из стека (программист командой RTI);
• Сброс маски I (МК);
• Возврат к исполнению основной программы (МК).
2. Каким образом МК семейства 68HC12/HCS12 определяет приоритет обслуживаемого запроса на прерывание?
Ответ:Последовательность расположения источников запросов в таблице векторов прерывания определяет их приоритет.
3. Часто в основной программе, которая содержит подпрограммы прерывания, одной из первых команд является команда SEI. Объясните почему?
Ответ: Простановка команды запрета маскируемых прерываний SEI в начале программы — своеобразный «хороший тон» при программировании. Эта команда запрещает прерывания во время инициализации периферии МК, т.е. когда МК находится в процессе создания своей внутренней структуры для решения конкретной задачи. Когда инициализация будет завершена, программист разрешит прерывания командой CLI.
4. Зачем МК семейства 68HC12/HCS12 очищает конвейер команд при прерываниях?
Ответ: При переходе на подпрограмму прерывания инструкции, коды которых хранятся в регистрах конвейера команд, будут отложены для исполнения. Поэтому их коды не сохраняются, и конвейер команд начинает выборку следующих за первой команд подпрограммы прерывания.
4.12. Оформление подпрограммы прерывания на Си
В данном параграфе мы рассмотрим основные особенности формирования исходного текста программы с прерываниями на Си. Конкретные примеры последуют позднее при рассмотрении конкретных устройств управления. На протяжении всех этих примеров мы будем использовать синтаксис компилятора ImageCraft ICC12. При использовании других компиляторов Вы встретитесь с теми же особенностями программирования. Возможно, что их реализация будет сопровождаться некоторыми другими правилами записи (синтаксиса) исходного текста программы.
Читать дальше