Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
HCS12 с применением языка С - royallib.ru.doc
Скачиваний:
124
Добавлен:
11.03.2016
Размер:
2.28 Mб
Скачать

4.11. Процесс перехода к подпрограмме прерывания

На рис. 4.12 показана последовательность действий МК семейства 68HC12/HCS12 по обработке запроса на прерывание, начиная с момента поступления запроса и заканчивая возвратом из подпрограммы прерывания к продолжению исполнения основной программы. При изучении механизма перехода к подпрограмме прерывания и возврата из нее Вам следует обратить внимание на то, какие действия совершаются аппаратными средствами МК, т.е. автоматически, а какие требуют программной поддержки, т.е. должны сопровождаться написанием специального программного кода.

Первый шаг при разработке прикладной программы, которая будет содержать подпрограммы прерывания, — создание в памяти таблицы векторов прерываний. Для этого в ячейки памяти с указанными в техническом описании МК адресами должны быть помещены адреса начала соответствующих подпрограмм прерывания. При написании исходного текста программы начальные адреса подпрограмм прерывания могут быть указаны в абсолютных значениях, т.е. в численном виде. Однако это неудобно при отладке программы, когда в результате исправления ошибок эти адреса будут изменяться. Поэтому более грамотно указывать в таблице векторов прерывания символьные имена подпрограмм прерывания. При программировании на ассемблере для этой цели обычно используется псевдокоманда Ассемблера «DW».

Второй шаг при разработке программы с прерываниями — инициализация начального значения указателя стека SP. Область стека используется микроконтроллером для хранения значений регистров центрального процессора во время исполнения подпрограммы прерывания. В МК семейства 68HC12/HCS12 при пересылке данных в память указатель стека сначала уменьшается на единицу, и только затем содержимое какого либо регистра загружается в память по новому адресу из SP. Поэтому начальное значение указателя стека должно быть равно увеличенному на единицу адресу последней ячейки в области стека. При программировании на Си программист обязан указать диапазон адресов области стека в опциях конфигурирования компилятора. Старший адрес этого диапазона будет загружен в указатель стека при исполнении файла Start.с.

Третий шаг — разрешить прерывания по выбранным источникам запросов. Это действие выполняется в два этапа. Сначала следует установить биты разрешения прерывания от каждого выбранного источника в соответствующем регистре специальных функций. Например, для прерывания от АЦП, должен быть установлен бит IRQEN в регистре INTCR. На втором этапе необходимо сбросить глобальную маску прерывания I в регистре признаков CCR. При программировании на ассемблере следует использовать команду «CLI».

После того, как указатель стека инициализирован и прерывания разрешены, пишется текст основной программы, которая будет являться фоновой программой. Поступление запроса на прерывание во время исполнения фоновой программы вызывает в микроконтроллере определенную последовательность действий (рис. 4.21), которую принято называть процессом перехода к подпрограмме прерывания.

Рис. 4.21.  Последовательность действий МК при обслуживании запроса на прерывание

Наиболее вероятно, что запрос поступит в момент, когда центральный процессор уже начал, но еще не завершил исполнение очередной команды. В большинстве случаев исполнение текущей команды будет завершено, в счетчике PC будет сформирован адрес следующей команды основной программы, и только затем МК начнет процедуру перехода к подпрограмме прерывания. В отличие о других, МК семейства 68HC12/HCS12 обладают рядом специфических команд, время исполнения которых значительно превышает время исполнения традиционных команд ассемблера. К таким командам относятся инструкции нечеткой логики REV, REVW, WAV, которые могут потребовать для своего выполнения несколько сот циклов центрального процессора. Поэтому, при возникновении запроса, исполнение этих команд будет прервано с сохранением промежуточных результатов. Завершение исполнения инструкции произойдет после выполнения подпрограммы прерывания. Центральный процессор МК семейства 68HC12/HCS12 оснащен двухступенчатым конвейером команд. Это означает, что во время исполнения текущей команды регистры конвейера команд хранят выбранные из памяти коды двух следующих команд. Когда запрос на прерывание поступает, нормальный порядок исполнения команд фоновой программы нарушается. Поэтому хранящиеся в конвейере команд коды становятся бесполезными, и конвейер автоматически очищается. После этого в счетчике команд автоматически восстанавливается адрес первой не исполненной команды фоновой программы, к которой МК должен будет вернуться после прерывания. Далее содержимое программного счетчика PC и других регистров центрального процессора сохраняется в стеке. Последовательность загрузки в стек следующая (рис. 4.22): старший байт счетчика команд PCH, младший байт счетчика команд PCL, старший YH и младший YL байты индексного регистра Y, старший XH и младший XL байты индексного регистра X, аккумулятор B, аккумулятор A, регистр признаков CCR. Важно, что это сохранение выполняется микроконтроллером автоматически, никаких команд в подпрограмме прерывания для этого не требуется.

Рис. 4.22. Последовательность загрузки регистров центрального процессора в стек

После того, как регистры будут сохранены в стеке, МК автоматически устанавливает глобальную маску прерывания I в 1, запрещая тем самым другие маскируемые прерывания. Бит маски внешнего прерывания по входу

  также устанавливается в 1.

Поэтому подпрограмма прерывания не может быть прервана даже немаскируемым внешним прерыванием. Далее в программный счетчик центрального процессора автоматически загружается адрес начала подпрограммы прерывания. Этот адрес извлекается из ячеек памяти таблицы векторов прерывания. Выбор необходимого адреса внутри таблицы векторов осуществляется аппаратными средствами микроконтроллера. Этот адрес соответствует источнику обрабатываемого прерывания.

По завершении исполнения подпрограммы прерывания, МК восстанавливает регистры центрального процессора из стека, включая программный счетчик PC, сбрасывает биты масок I и X в регистре CCR. Таким образом, в МК восстанавливается состояние центрального процессора, которое было до исполнения подпрограммы прерывания. И процесс выполнения фоновой программы возобновляется. В исходном тексте подпрограммы прерывания для ее корректного завершения записывается команда возврата из прерывания RTI. Именно эта команда реализует действия по восстановлению регистров из стека и сбросу масок прерывания. Обратите внимание, в начале подпрограммы прерывания для выгрузки регистров в стек и установки масок I и X не требуется команд. А для выполнения обратных действий программист должен воспользоваться командой RTI. При написании программы на Си подпрограмма прерывания оформляется как функция. При этом если объявлено, что функция является подпрограммой прерывания, то команда ассемблера RTI подставляется в исходный текст автоматически. Мы рассмотрим процесс составления исходного текста программы с прерываниями на Си в следующем параграфе.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]