Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






 

На рис. 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. Важно, что это сохранение выполняется микроконтроллером автоматически, никаких команд в подпрограмме прерывания для этого не требуется.

 

Адрес ячейки памяти Содержимое ячейки стека
Указатель стека – 2 Старший байт адреса возврата; младший байт адреса возврата
Указатель стека – 4 Старший байт регистра Y; младший байт регистра Y
Указатель стека – 6 Старший байт регистра X; младший байт регистра X
Указатель стека – 8 Аккумулятор B; Аккумулятор A
Указатель стека – 9 Регистр состояния CCR

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

 

После того, как регистры будут сохранены в стеке, МК автоматически устанавливает глобальную маску прерывания 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 очищает конвейер команд при прерываниях?

Ответ: При переходе на подпрограмму прерывания инструкции, коды которых хранятся в регистрах конвейера команд, будут отложены для исполнения. Поэтому их коды не сохраняются, и конвейер команд начинает выборку следующих за первой команд подпрограммы прерывания.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.