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