Ноя 12 2010

Прерывания в Cortex M3. Часть 1

По сравнению с микроконтроллерами ARM7, такими как LPC2368, в архитектуре Cortex M3 наибольшей модернизации подверглась система прерываний. Она стала существенно более сложной и гибкой. Ниже будут рассмотрены некоторые особенности нового контроллера прерываний (Nested Vectored Interrupt Controller, NVIC).

Общие сведения о NVIC таковы:

  • поддержка 35 векторных прерываний (в LPC17xx), всего ядро Cortex M3 может поддерживать до 112 прерываний
  • поддержка как прерываний от периферии, так и системных исключений
  • 32 программируемых уровней приоритета с возможностью маскирования
  • перемещаемая таблица векторов
  • поддержка программного прерывания

Также NVIC поддерживает одно немаскируемое прерывание (NMI) от входа P2.10/NMI.

Прерывания пронумерованы от 0 до 34, и включают в себя прерывания от таймеров, UART, внешние прерывания, а также прерывания от других периферийных устройств.

Каждое прерывание может находится в одном из 4-х состояний:

  • Неактивное/Inactive
  • Отложенное/Pending
  • Активное/Active
  • Активное и отложенное/Active and pending (состояние возникает, когда во время обработки прерывания наступило прерывание от того же источника).

Контроллер прерываний включает в себя следующие регистры:

ISER0, ISER1 — Interrupt Set-Enable Registers

ICER0-ICER1 — Interrupt Clear-Enable Registers

ISPR0-ISPR1 — Interrupt Set-Pending Registers

ICPR0-ICPR1 — Interrupt Clear-Pending Registers

IABR0-IABR1 — Interrupt Active Bit Registers

IPR0 — IPR8 — Interrupt Priority Registers (каждый регистр приоритета содержит 5-битные поля приоритета для 4-х прерываний)

STIR — Software Trigger Interrupt Registers

Подробное описание регистров NVIC приведено в документации на микроконтроллер.

Исключения (Exception)

Каждое прерывание является исключением, однако не каждое исключение является прерыванием. Помимо обычных прерываний, имеются системные исключения. Одно из таких исключений, SysTick, было рассмотрено здесь: http://32bit.me/?p=796. Системные исключения не входят в число 35 прерываний, которыми мы можем управлять через регистры NVIC, управление ими происходит через другие регистры, такие как System Handler Priority Registers (SHPR1 — SHPR3). Системные исключения также имеют приоритеты, однако у некоторых из них приоритеты фиксированы и имеют отрицательные значения. Это означает, что никакое прерывание с программируемым приоритетом не может иметь более высокий приоритет, чем прерывание с фиксированным отрицательным приоритетом.

Однако никакой принципиальной разницы между прерываниями и системными исключениями нет.

Группирование прерываний по приоритетам

Самой интересной особенностью NVIC в Cortex M3 является возможность группирования прерываний по приоритетам.

Что это такое? Каждому прерыванию может быть назначен приоритет и субприоритет. Допустим, у нас задействованы 4 прерывания таймеров: TIMER0-TIMER3, которым назначены следующие приоритеты и субприоритеты (обозначим их как P и S соответственно):

TIMER0 — P = 0, S = 0

TIMER1 — P = 1, S = 0

TIMER2 — P = 1, S = 1

TIMER3 — P = 2 S = 0

Высшим приоритетом является нулевой, чем больше номер приоритета, тем приоритет ниже. Субприоритеты нумеруются аналогично: высшим субприоритетом является нулевой.

Прерывания подчиняются следующим правилам:

Прерывания с высшим приоритетом всегда прерывает обработку прерывания с более низким приоритетом. В рассмотренном примере прерывание TIMER0 прервёт обработку TIMER2, но TIMER1 не прервёт обработку TIMER2, так как они имеют одинаковый приоритет. Номер субприоритета при этом не имеет значения.

Если выполняется обработка TIMER0, и в это время возникают прерывания TIMER1, TIMER2 и TIMER3, то их выполнение откладывается (pending). По окончании обработки TIMER0 контроллер прерываний начинает выполнение одного из отложенных прерываний, исходя из его приоритета и субприоритета. В рассмотренном примере после выполнения обработки TIMER0 отложенные прерывания будут выполняться в следующем порядке: TIMER1, TIMER2 и TIMER3.

Выше упоминалось о том, что приоритет задаётся 5-битным полем в регистрах IPR0 — IPR8. Как задаётся субприоритет?

Приоритет и субприоритет задаются в одном и том же 5-битном поле, при этом количество бит, отводимых на номер субприоритета задаётся программно в регистре AIRCR (Application Interrupt and Reset Control Register). Трёхбитовое поле PRIGROUP этого регистра определяет, сколько бит в поле приоритета будет отводиться под субприоритет (от 0 до 5). Для записи в этот регистр его необходимо «отпереть» ключом, записав в поле VECTKEYSTAT «магическое» число 0x5FA.

Подробная информация по прерываниям и исключениям приведена в [1]: Chapter 34: Appendix: Cortex-M3 User Guide/3.3 Exception model

Описание NVIC приведено в [1]: Chapter 6: LPC17xx Nested Vectored Interrupt Controller (NVIC)

Литература:

1. UM10360. LPC17xx User Manual. Rev 01 — 4 January 2010.

Комментарии (3)

  • By Organizm, 29.02.2012 @ 19:16

    Поправочка: ядро Cortex M3 может поддерживать до 240 прерываний и до 256 программно-настраиваемых уровней приоритета на каждое прерывание. Конкретное их количество зависит от реализации производителем.(согласно DUI0552A_Cortex™-M3 Devices Generic User Guide, Cortex™-M3 Technical Reference Manual)

  • By arktur04, 29.02.2012 @ 23:48

    Вполне возможно.
    Я пользовался только документацией NXP.

Other Links to this Post

  1. 32 bit.me » Прерывания в Cortex M3. Часть 2 — 17.11.2010 @ 20:19

RSS-лента комментариев к этой записи. TrackBack URI

Оставить комментарий