Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорная техника Сторожок / MPLAB_C30_Руководство пользователя.pdf
Скачиваний:
161
Добавлен:
20.02.2016
Размер:
1.26 Mб
Скачать

Глава 8. Прерывания

ТАБЛИЦА 8-4. (ПРОД-Е) ВЕКТОРА ПРЕРЫВАНИЙ dsPIC33F/PIC24F

 

 

Номер

Основной

Альтернативный

 

 

Описание

 

 

 

 

 

 

 

 

 

 

109

_Interrupt109

_AltInterrupt109

 

 

Зарезервирован

 

 

110

_Interrupt110

_AltInterrupt110

 

 

Зарезервирован

 

 

 

 

 

 

 

 

 

 

111

_Interrupt111

_AltInterrupt111

 

 

Зарезервирован

 

 

 

 

 

 

 

 

 

 

112

_Interrupt112

_AltInterrupt112

 

 

Зарезервирован

 

 

 

 

 

 

 

 

 

 

113

_Interrupt113

_AltInterrupt113

 

 

Зарезервирован

 

 

 

 

 

 

 

 

 

 

114

_Interrupt114

_AltInterrupt114

 

 

Зарезервирован

 

 

 

 

 

 

 

 

 

 

115

_Interrupt115

_AltInterrupt115

 

 

Зарезервирован

 

 

 

 

 

 

 

 

 

 

 

116

_Interrupt116

_AltInterrupt116

 

.

Зарезервирован

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

117

_Interrupt117

_AltInterrupt117

A

 

Зарезервирован

 

 

 

 

 

 

 

 

 

 

 

 

 

8.5.

Сохранение контекста в ISR

 

 

 

 

 

Прерывания, в силу своей природы, могут произойти в непредсказуемый момент.

 

Поэтому прерванный код должен иметь возможность продолжиться с того же

 

самого состояния машины, которое было, когда произошло прерывание.

 

Чтобы правильно обработать возврат из прерывания, код подготовки (пролога) ISR

 

автоматически сохраняет управляемые компилятором

рабочие и специальные

 

регистры в стеке, для последующего восстановления по окончанию ISR. Вы можете

 

использовать необязательный параметр save атрибута interrupt, чтобы

 

определить дополнительные переменные и SFR для сохранения и восстановления.

 

В отдельных приложениях

можетWilsonбыть необходимо

включение операторов

 

 

 

by

 

 

 

 

 

ассемблера в программу обслуживания прерывания непосредственно перед прологом функции, генерируемым компилятором. Например, может потребоваться, чтобы семафор увеличивался немедленно при входе в ISR. Это можно сделать следующим образом:

ОбслуживаниеTranslatedпрерывания процессором — Время, необходимое процессору, чтобы распознать прерывание и перейти на первый адрес вектора прерывания. Чтобы определить эту величину, см. в документации на процессор сведения по используемому процессору и источнику прерывания.

Код ISR — Компилятор сохраняет регистры, которые он используется в ISR. Сюда включаются рабочие регистры и специальный регистр RCOUNT. Больше того, если ISR вызывает обычную функцию, то компилятор сохранит все рабочие регистры и RCOUNT, даже если они все не используются явно самой ISR. Это должно быть сделано, поскольку компилятор в общем случае не может знать, какие ресурсы используются вызываемой функцией.

8.7.Вложенные прерывания вашейвременем

16-битовые устройства поддерживают вложенные прерывания. Поскольку ресурсы процессора ISR сохраняет в стеке, вложенные ISR кодируются точно таким же способом, как невложенные. Вложенные прерывания разрешаются очисткой бита NSTDIS (nested interrupt disable) в регистре INTCON1. Заметьте, что это условие по умолчанию, т.е. 16-битовое устройство выходит из сброса с разрешением

© 2008 Microchip Technology Inc.

DS51284H(ru) стр. 8-13

16-битовый компилятор Си. Руководство

вложенных прерываний. Каждому источнику прерываний назначается приоритет в регистре управления приоритетом прерываний (IPCn). Если есть необслуженный запрос прерывания (IRQ) с уровнем приоритета равным или большим, чем текущий уровень приоритета процессора (поле IPL в регистре ST и бит IPL3 в регистре CORCON), прерывание будет передано в процессор.

8.8.Разрешение/запрещение прерываний

Каждый источник прерывания может быть индивидуально разрешен или запрещен. По одному биту разрешения прерывания для каждого IRQ располагаются в регистрах управления разрешением прерываний (IECn). Установка бита

разрешения прерывания в единицу (1) разрешает соответствующее прерывание,

A

.(0) запрещает соответствующее

очистка бита разрешения прерывания в нуль

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

Примечание Исключения, как например, ошибка адресации, не могут быть запрещены. Запрещать можно только аппаратные прерывания.

Команда DISI может быть использована в программе на Cи с помощью inline ассемблера. Например, оператор:

__asm__ volatile ("disi #16");

 

вставит указанную инструкцию DISI в место своего появления в исходной

Wilson

в том, что программист не

программе. Недостаток такого использования DISI

всегда может знать, как компиляторby Cи переведет исходный код Cи в машинные команды, что затрудняет определение величины счетчика циклов для команды DISI. Возможно обойти эту проблему, заключая код, который должен быть защищен от прерываний, между двумя командами DISI, первая из которых устанавливает счетчик циклов на максимальную величину, а вторая сбрасывает счетчик циклов в нуль. Например:

DISICNTTranslated= 0x0000; /* разрешение прерываний */

__asm

volatil ("disi

#0x3FFF"); /* запрет прерываний */

/*... защищенный код Cи... */

__asm

vol tile("disi

#0x0000"); /* разрешение прерываний */

Альтернативный метод представляет собой непосредственную запись в регистр DISICNT для разрешения прерываний. Регистр DISICNT может модифицироваться только после того, как была выполнена команда DISI и его содержимое не является нулем.

__asm

volatile("disi #0x3FFF"); /* запрет прерываний */

/*...

защищенный код Cи... */

В некоторых приложениях может потребоваться запрет прерываний также и с приоритетом 7-го уровня. Они могут быть запрещены только через модификацию бита IPL3 регистра CORCON. Предоставляемые файлы поддержки содержат несколько полезных макросов препроцессора, облегчающих модификацию величины IPL (только в регистре ST). Это:

SET_CPU_IPL(ipl)

SET_AND_SAVE_CPU_IPL(save_to, ipl)

RESTORE_CPU_IPL(saved_to)

Например, вы хотите защитить часть кода от прерывания. Следующий код изменит текущие установки IPL и затем восстановит в IPL его первоначальную величину.

DS51284H(ru) стр. 8-14

© 2008 Microchip Technology Inc.

Соседние файлы в папке Микропроцессорная техника Сторожок