Портирование приложений с семейства PIC18 на PIC24F
1.6. Контроллер прерываний
Функции контроллера прерываний ядра PIC24F значительно расширены по сравнению с семейством PIC18. Увеличено количество векторов прерываний, количество уровней приоритета, добавлены аппаратные и программные исключения (trap). Сравнение контроллеров прерываний архитектур PIC18 и PIC24F приведено в табл. 13.
Таблица 13. Сравнение контроллеров прерываний семейств PIC18 и PIC24F
Параметр |
PIC18 |
PIC24F |
Уникальный бит разрешения и флаг для каждого источника прерывания |
да |
да |
Глобальное разрешение прерываний |
да |
да |
Программно сбрасываемые флаги прерываний |
да |
да |
Флаг прерывания устанавливается вне зависимости от разрешения прерывания |
да |
да |
Пользовательский код может генерировать любое прерывание периферии |
да |
да |
Автоматическое сохранение/восстановление контекста |
да |
да |
Выход из энергосберегающих режимов |
да |
да |
Доступные приоритеты прерываний |
высокий и низкий |
8 уровней, определяется пользователем |
Время реакции на внешнее прерывание (по выводу INT или изменению значения порта PORTB) |
3 или 4 командных такта |
5 командных тактов (фиксировано) |
Приоритетный выход из режимов SLEEP и IDLE |
нет |
да |
Возможность запрета вложенных прерываний |
нет |
да |
Программный выбор текущего приоритета ядра |
нет |
да |
Векторы исключений |
нет |
да (4 вектора) |
Уникальный вектор прерывания для каждого источника |
нет |
да |
Альтернативная таблица векторов прерываний |
нет |
да |
Немаскируемые прерывания |
нет |
да |
Возможность запрещения прерываний на определенное количество командных тактов |
нет |
да |
1.6.1. Новые возможности контроллера прерываний ядра PIC24F
Уникальный вектор прерывания для каждого источника или исключения: Каждый источник прерывания аппаратно ассоциирован с уникальным вектором из таблицы, векторы которой имеют естественный адресный приоритет. Это позволяет не проводить опрос флагов, тем самым, увеличив скорость реакции на прерывание.
Приоритет, задаваемый пользователем: Каждому источнику прерывания может быть задан приоритет от 0 до 7, что позволяет изменять аппаратно заданные естественные адресные приоритеты.
Программно изменяемый приоритет ядра: Пользователь может изменить текущий приоритет ядра в реальном времени, маскируя прерывания с более низким приоритетом.
Вложенные прерывания: Использование службы приоритетов позволяет проектировать системы с большим уровнем вложенности прерываний. Вложенность может быть аппаратно заблокирована.
Программные (soft) и аппаратные (hard) исключения (traps): До восьми немаскируемых исключений с наивысшим приоритетом используются для отслеживания критических ошибок, таких как математические (деление на ноль), ошибки стека, сбой тактового генератора, ошибка выравнивания адреса программ и данных.
Альтернативная таблица векторов прерываний: обеспечивает удобный способ переключения между основным и служебным кодом (например, реализация бутлоадера).
Приоритетный выход из энергосберегающих режимов: Обеспечивает возможность либо продолжения выполнения программы, либо перехода на вектор в зависимости от приоритета прерывания.
Все возможности и особенности контроллера прерываний ядра PIC18 так же поддерживаются в ядре PIC24F.
1.6.2. Немаскируемые исключения
В архитектуре PIC24 предусмотрено четыре немаскируемых исключения (событий, вызывающих критическую ошибку):
- ошибка декодирования адреса
- сбой тактового генератора
- ошибка стека
- математическая ошибка
При возникновении одного из вышеперечисленных событий в программный счетчик (PC) загружается адрес соответствующего вектора. Два наиболее серьезных исключения (ошибка декодирования адреса и сбой тактового генератора) являются аппаратными – выполнение программы не может быть продолжено до устранения ошибки, флаг исключения нельзя сбросить программно. Остальные исключения являются программными, выполнение кода может быть продолжено без устранения ошибки. Каждое исключение имеет индивидуальный вектор в таблице прерываний.
В ядре PIC24F зарезервировано еще четыре вектора исключений, которые могут быть добавлены в следующие версии кристаллов.
Архитектура PIC18 не имеет эквивалента исключениям PIC24F. В PIC18 ошибка стека вызывает сброс контроллера.
1.6.3. Изменение имен и размещения битов
Микроконтроллеры семейств PIC24F и PIC18 имеет похожие структуры управления прерываниями. Обе архитектуры имеют набор битов разрешения прерываний, флагов прерываний и установки приоритетов прерываний (именуются как xxxIE, xxxIF и xxxIP соответственно, где xxx – мнемоника источника прерывания). Однако есть два значительных отличия.
Первое различие – использование в PIC24F трех битов установки приоритета прерывания вместо одного в PIC18. Они именуются как xxxIP2, xxxIP1, xxxIP0 и позволяют установить прерыванию приоритет от 0 до 7.
Второе различие – количество источников прерываний - добавлены источники прерываний, отсутствующие в семействе PIC18. Следует заметить, что прерывания с похожими мнемониками могут возникать в семействах PIC18 и PIC24F в разных случаях. Пользователь должен ознакомиться с документацией на семейство PIC24F [1], чтобы точно представлять, как называется определенный источник и в каком случае он вызывает прерывание.
1.6.4. Инициализация и разрешение прерываний
Для инициализации и разрешения прерывания в семействе PIC18 необходимо:
- сбросить флаг прерывания в соответствующем регистре PIRx или INTCONx;
- установить бит разрешения прерывания в соответствующем регистре PIEx или INTCONx.
Опционально:
- выбрать систему приоритетов прерываний, установив или сбросив бит IPEN (RCON<7>);
- установить приоритет прерывания в соответствующем регистре IPRx.
Для инициализации и разрешения прерывания в семействе PIC24F необходимо:
- установить бит NSTDIS (INTCON1<15>) если необходимо запретить вложенность прерываний;
- сбросить флаг прерывания в соответствующем регистре IFSx;
- установить бит разрешения прерывания в соответствующем регистре IECx.
Опционально:
- установить требуемый приоритет прерывания в соответствующем регистре IPCx. Приоритет прерывания выбирается пользователем в соответствии с требованиями к ПО. Если все прерывания должны быть равных приоритетов, требуется установить биты приоритета равными для всех разрешенных прерываний. После сброса все прерывания имеют приоритет 4.
1.6.5. Запрещение пользовательских прерываний
Для запрещения всех прерываний в микроконтроллерах семейства PIC18 необходимо и достаточно сбросить бит GIE (или GIEL и GIEH, если используется приоритетная система).
Для запрещения всех прерываний в микроконтроллерах семейства PIC24 необходимо:
- Поместить текущее значение регистра STATUS в программный стек, используя инструкцию PUSH
- Переключить текущий приоритет ядра на уровень 7, используя операцию побитового ИЛИ константы 0x0E и младшего байта регистра STATUS (SRL). Для разрешения прерываний необходимо восстановить значение регистра STATUS из стека, используя инструкцию POP.
Используя инструкцию DISI можно запретить прерывания с приоритетами 1-6 на фиксированное количество командных тактов.
1.6.6. Рекомендации по портированию приложения
Ядро PIC18 позволяет назначить прерываниям только два уровня приоритета – высокий и низкий. Контроллер прерываний PIC24F использует приоритетную модель с бОльшим количеством уровней приоритета (доступные пользователю – от 0 до 7, аппаратно фиксированные для немаскируемых исключений – от 8 до 15). Таким образом, при портировании приложения необходимо как минимум пересмотреть назначение приоритетов используемым источникам прерываний.