Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП МПУ-13.doc
Скачиваний:
7
Добавлен:
01.04.2025
Размер:
5.78 Mб
Скачать

3.5. Принцип и средства ввода/вывода по прерываниям.

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

Основные этапы обработки прерывания, формирование запроса и вектора (адрес в таблице векторов), сохранение и восстановление контекста, временные затраты – задержка реакции и задержка фоновой программы. Флаги прерывания, маскирование общее и индивидуальное, система приоритетов – аппаратная (жесткая) и программная (гибкая), вложенные прерывания. Контроллер прерываний, аппаратные и программные прерывания, внутренние и внешние прерывания.

Входы прерываний: событие (переход и уровень), регистры управления и состояния, структура ПО (пример).

Сторожевой таймер: аппаратная структура, регистры управления и состояния, пример расчета времени и использования команд (обратить внимание на IS\R и циклы ожидания готовности).

Механизм прерываний

Механизм прерываний [interrupt] удобен для быстрой программной реакции на события (сигналы) асинхронные с основным циклом управляющей программы. По запросу прерывания [interrupt inquiry] приостанавливается выполнение текущей программы (фоновой программы), выполняется короткая подпрограмма обслуживания данного запроса, далее продолжается выполнение фоновой программы.

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

В конце каждого машинного цикла при наличии общего разрешения прерываний процессор проверяет наличие запросов прерывания. Если данное прерывание разрешено, процессор выполняет действия аналогичные вызову подпрограммы с заранее определенным адресом (вектором), и сохраняет в стеке адрес прерванной программы. В конце подпрограммы обслуживания прерывания [Interrupt SubRoutine - ISR] должна находиться команда возврата из прерывания [Return Interrupt]. При ее выполнении происходит возврат в точку прерывания фоновой программы.

Выполнение подпрограммы обслуживания прерывания должно быть «прозрачным», т. е. незаметным для прерываемой (фоновой программы) – не должно нарушаться содержимое регистра состояния (флаги процессора) и тех РОН, которые используются фоновой программой. Названные ресурсы называются контекстом. Если ISR вынуждена делить ресурсы с другими программами, требуется при входе в подпрограмму сохранять содержимое используемых ресурсов в стеке, а перед выходом из ISR – восстанавливать из стека в обратном порядке. В высокопроизводительных процессорных устройствах слово состояния процессора сохраняется аппаратно контроллером прерываний, в 8-разрядных это забота программиста.

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

Прерывания бывают внешние – формируются сигналами определенного вида на внешних входах МК и внутренние – формируются внутренними, в том числе периферийными узлами МК. Каждый источник прерывания имеет индивидуальные вектор, флаг, маску и уровень приоритета.

Вектором называется фиксированный адрес начала ISR. Обычно область ISR размещается в начале памяти программ, сразу после ячейки с адресом 0 прерывания по пуску/перезапуску МК.

Флагом запроса прерывания называется бит в РСФ, устанавливаемый в «1» аппаратурой МК при формировании условия прерывания. Сброс этого бита обычно выполняется автоматически при вызове ISR или программно, если прерывание не разрешено.

Маской называется бит в РСФ, служащий для разрешения индивидуального прерывания. ISR начнет выполняться тогда и только тогда, когда будут установлены биты флага, маски и бит глобального (общего) разрешения прерывания.

При одновременном поступлении более чем одного разрешенного запроса прерывания вступает в действие механизм приоритетов, который выбирает для обслуживания только один запрос. В простых 8-разрядных МК система приоритетов ограничена аппаратным распределением уровней – чем меньше численное значение вектора (адреса), тем выше уровень приоритета.

В более сложных МК в дополнение к аппаратным существуют программные уровни приоритета. Они позволяют объединять прерывания в группы, внутри которых действует аппаратный механизм распределения приоритетов.

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

Работа с прерываниями на языке С/С++ имеет ряд особенностей, связанных с оформлением вызова ISR и обмена данными.

Механизм прерываний не входил в стандарт языка С/С++, поэтому в разных трансляторах встречаются отличия в оформлении механизмов прерывания. Общим правилом является обозначение ISR как функции с пустыми [void] списками входных и выходного параметров и объявление вектора прерывания (адреса) как символьной константы (как правило, после служебного слова interrupt). Закрывающая фигурная скобка данной функции заставляет транслятор завершать текст подпрограммы командой возврата из прерывания [reti для AVR].

Для обмена данными используется механизм глобальных переменных.

Сохранение и восстановление контекста (как и вообще работа с РОН) выполняется транслятором без участия программиста. Но это не избавляет программиста от заботы по сокращению времени выполнения ISR за счет отказа или минимизации вычислительных процедур в теле ISR.

Генерация команд общего разрешения/запрещения прерываний выполняется либо с использованием механизма ассемблерных вставок [#asm("sei") в CodeVisionAVR], либо в виде специальных функций [__enable_interrupt(); в IAR-C/C++].