Обзор контроллеров прерываний
Apr. 15th, 2019 02:20 pmВкратце опишу здесь особенности контроллеров прерываний для архитектур AVR ATmega, ARM Cortex-M4 и MIPS PIC32. Будет информация к размышлению, как нам обустроить МЭСМ-6.
Количество внешних прерываний зависит от модели конкретного микроконтроллера, и находится в пределах нескольких десятков. Каждое внешнее прерывание имеет свой адрес обработчика, например:
Для каждого отдельного прерывания есть бит разрешения в управляющих регистрах соответствующего блока (таймер, UART, SPI и т.п.).
Здесь нет общего регистра, откуда можно было бы прочитать состояние сразу всех прерываний. Это не очень удобно при отладке. В ситуации, когда возникло внешнее прерывание, и не сразу понятно какое, надо прочитать кучу разных регистров из разных блоков, чтобы определить виновника.
Имеется до 240 внешних прерываний. Каждое внешнее прерывание имеет свой адрес обработчика. Младшие адреса обработчиков заняты для внутренних исключений, например:
Регистры ISER и ICER: маска разрешённых прерываний. Запись единицы в ISER разрешает соотвествующее прерывание. Запись единицы в ICER запрещает соотвествующее прерывание.
Регистр IABR: маска активных прерываний, которые стучатся на вход процессора. Некоторые из них могут быть разрешёнными, другие запрещёнными. Только чтение.
Регистр IPSR: номер активного прерывания c наибольшим приоритетом.Только чтение.
Есть глобальный бит разрешения прерываний в процессоре (Status.IE). Плюс к этому набор регистров в блоке контроллера прерываний.
Процессор программно конфигурируется на (1) один общий обработчик всех прерываний, или (2) отдельный обработчик для каждого прерывания, с заданным шагом адреса.
Имеется до 256 внешних прерываний. Регистры управления прерываниями имеют размер 256 бит (8 слов по 32 бита).
Регистр IEC: Interrupt Enable Control, или маска разрешённых прерываний. Писать в него можно также по двум дополнительным адресам: IECSET - запись единицы разрешает соотвествующее прерывание; IECCLR - запись единицы запрещает соотвествующее прерывание.
Регистр IFS: Interrupt Flag Status, или маска возникших прерываний. При поступлении запроса на прерывание бит маски устанавливается в единицу ("залипает"). Должен быть сброшен программно в 0. Писать можно также по двум дополнительным адресам: IFSSET - запись единицы устанавливает соотвествующий бит статуса; IFSCLR - запись единицы сбрасывает соотвествующий бит статуса.
Регистр INTSTAT: номер активного прерывания c наибольшим приоритетом.
AVR ATmega
Количество внешних прерываний зависит от модели конкретного микроконтроллера, и находится в пределах нескольких десятков. Каждое внешнее прерывание имеет свой адрес обработчика, например:
Адрес Прерывание
------------------------------------
0x000 Power-on Reset
0x001 External Interrupt Request 0
0x002 External Interrupt Request 1
0x003 Pin Change Interrupt Request 0
0x004 Pin Change Interrupt Request 1
0x005 Pin Change Interrupt Request 2
0x006 Watchdog Time-out Interrupt
0x007 Timer/Counter2 Compare Match A
0x008 Timer/Counter2 Compare Match B
0x009 Timer/Counter2 Overflow
0x00A Timer/Counter1 Capture Event
0x00B Timer/Counter1 Compare Match A
0x00C Timer/Coutner1 Compare Match B
0x00D Timer/Counter1 Overflow
0x00E Timer/Counter0 Compare Match A
0x00F Timer/Counter0 Compare Match B
0x010 Timer/Counter0 Overflow
0x011 SPI Serial Transfer Complete
0x012 USART Rx Complete
0x013 USART, TX Output Register Empty
0x014 USART, Tx Complete
0x015 ADC Conversion Complete
0x016 EEPROM Ready
Есть глобальный бит разрешения всех прерываний GIE: Global Interrupt Enable.Для каждого отдельного прерывания есть бит разрешения в управляющих регистрах соответствующего блока (таймер, UART, SPI и т.п.).
Здесь нет общего регистра, откуда можно было бы прочитать состояние сразу всех прерываний. Это не очень удобно при отладке. В ситуации, когда возникло внешнее прерывание, и не сразу понятно какое, надо прочитать кучу разных регистров из разных блоков, чтобы определить виновника.
Cortex M4
Имеется до 240 внешних прерываний. Каждое внешнее прерывание имеет свой адрес обработчика. Младшие адреса обработчиков заняты для внутренних исключений, например:
Адрес Прерывание
------------------------------------
0x0000 Initial SP value
0x0004 Reset
0x0008 NMI
0x000C Hard fault
... ...
0x0040 IRQ0
0x0044 IRQ1
0x0048 IRQ2
... ...
Регистры управления прерываниями имеют размер 256 бит (8 слов по 32 бита).Регистры ISER и ICER: маска разрешённых прерываний. Запись единицы в ISER разрешает соотвествующее прерывание. Запись единицы в ICER запрещает соотвествующее прерывание.
Регистр IABR: маска активных прерываний, которые стучатся на вход процессора. Некоторые из них могут быть разрешёнными, другие запрещёнными. Только чтение.
Регистр IPSR: номер активного прерывания c наибольшим приоритетом.Только чтение.
PIC32
Есть глобальный бит разрешения прерываний в процессоре (Status.IE). Плюс к этому набор регистров в блоке контроллера прерываний.
Процессор программно конфигурируется на (1) один общий обработчик всех прерываний, или (2) отдельный обработчик для каждого прерывания, с заданным шагом адреса.
Имеется до 256 внешних прерываний. Регистры управления прерываниями имеют размер 256 бит (8 слов по 32 бита).
Регистр IEC: Interrupt Enable Control, или маска разрешённых прерываний. Писать в него можно также по двум дополнительным адресам: IECSET - запись единицы разрешает соотвествующее прерывание; IECCLR - запись единицы запрещает соотвествующее прерывание.
Регистр IFS: Interrupt Flag Status, или маска возникших прерываний. При поступлении запроса на прерывание бит маски устанавливается в единицу ("залипает"). Должен быть сброшен программно в 0. Писать можно также по двум дополнительным адресам: IFSSET - запись единицы устанавливает соотвествующий бит статуса; IFSCLR - запись единицы сбрасывает соотвествующий бит статуса.
Регистр INTSTAT: номер активного прерывания c наибольшим приоритетом.