Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
Шрифт:
Рис. 4.22. Последовательность загрузки регистров центрального процессора в стек
После того, как регистры будут сохранены в стеке, МК автоматически устанавливает глобальную маску прерывания I в 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. При использовании других компиляторов Вы встретитесь с теми же особенностями программирования. Возможно, что их реализация будет сопровождаться некоторыми другими правилами записи (синтаксиса) исходного текста программы.
При программировании на Си Вы должны обязательно реализовать следующие этапы записи исходного текста:
1. При написании программы обработки прерывания на Си, имя подпрограммы обработки прерывания должно быть объявлено с использованием специальной директивы препроцессора. В компиляторе ImageCraft ICC12 для этой цели следует использовать директиву #pragma:
В поле <name> следует записать имя подпрограммы прерывания, которое Вы будете далее использовать в тексте программы. Приведенная запись информирует компилятор о том, что функция с названным именем является подпрограммой прерывания.
2. Далее по тексту подпрограмма прерывания оформляется как обычная функция. Компилятор в процессе перевода исходного текста этой функции на Си в инструкции ассемблера автоматически подставит в конце подпрограммы команду возврата из прерывания RTI, потому что эта функция была объявлена подпрограммой прерывания (директива #pragma на этапе 1).
3. Для правильного функционирования МК в процессе прерывания необходимо инициализировать указатель стека. Его значение должно быть равно старшему адресу области оперативной памяти МК, увеличенному на единицу. Поскольку диапазоны памяти пользователя (как постоянной, так и оперативной) являются необходимыми установками в конфигурации компилятора, то функция инициализации указателя стека выполняется компилятором автоматически. Поэтому программист не должен записывать какой либо текст в программе для инициализации указателя стека. Зато следует проверить карту памяти в установках компилятора, которая обязательно должна совпадать с реальной проектируемой системой.
4. Подсистема прерывания будет функционировать корректно, если для нее сформирована таблица векторов прерывания. Мы уже обсуждали, что таблица векторов прерывания в МК B32 находится в области Flash-памяти, которая защищена от перезаписи информации. Для того, чтобы пользователь имел возможность записать собственную таблицу векторов сброса и прерывания, в эту нестираемую область памяти записаны фиксированные вектора, которые передают управление по известным адресам в области перезаписываемой EEPROM памяти (см. рис. 4.19). По этим адресам программист должен вписать команду безусловного перехода JMP с адресом соответствующей подпрограммы обработки прерывания.
5. Каждый маскируемый источник запроса на прерывание должен быть разрешен установкой соответствующего бита в регистре управления периферийного модуля. Мы рассмотрим, как это записать на Си в последующих примерах.
6. После установки всех индивидуальных битов на разрешение прерывания, необходимо сбросить глобальную маску прерывания I. На ассемблере для этого используют команду CLI. При программировании на Си мы также воспользуемся этой командой, посредством следующих макросов: