Isr

Прерывание процедуры обслуживания. Функция, которая вызывается в ответ на сигнал прерывания.


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

Процессор Atmega328P, используемый в Arduino Uno, Duemilanove, Pro Mini, Nano и других, имеет 25 возможных прерываний, помимо сброса.

Они:

 1  Reset 
 2  External Interrupt Request 0  (pin D2)          (INT0_vect)
 3  External Interrupt Request 1  (pin D3)          (INT1_vect)
 4  Pin Change Interrupt Request 0 (pins D8 to D13) (PCINT0_vect)
 5  Pin Change Interrupt Request 1 (pins A0 to A5)  (PCINT1_vect)
 6  Pin Change Interrupt Request 2 (pins D0 to D7)  (PCINT2_vect)
 7  Watchdog Time-out Interrupt                     (WDT_vect)
 8  Timer/Counter2 Compare Match A                  (TIMER2_COMPA_vect)
 9  Timer/Counter2 Compare Match B                  (TIMER2_COMPB_vect)
10  Timer/Counter2 Overflow                         (TIMER2_OVF_vect)
11  Timer/Counter1 Capture Event                    (TIMER1_CAPT_vect)
12  Timer/Counter1 Compare Match A                  (TIMER1_COMPA_vect)
13  Timer/Counter1 Compare Match B                  (TIMER1_COMPB_vect)
14  Timer/Counter1 Overflow                         (TIMER1_OVF_vect)
15  Timer/Counter0 Compare Match A                  (TIMER0_COMPA_vect)
16  Timer/Counter0 Compare Match B                  (TIMER0_COMPB_vect)
17  Timer/Counter0 Overflow                         (TIMER0_OVF_vect)
18  SPI Serial Transfer Complete                    (SPI_STC_vect)
19  USART Rx Complete                               (USART_RX_vect)
20  USART, Data Register Empty                      (USART_UDRE_vect)
21  USART, Tx Complete                              (USART_TX_vect)
22  ADC Conversion Complete                         (ADC_vect)
23  EEPROM Ready                                    (EE_READY_vect)
24  Analog Comparator                               (ANALOG_COMP_vect)
25  2-wire Serial Interface  (I2C)                  (TWI_vect)
26  Store Program Memory Ready                      (SPM_READY_vect)

Имя вектора обработчика прерываний указано в скобках.

Если происходит событие прерывания (например, переполнение Таймера 0), и это конкретное прерывание разрешено, и прерывания в настоящее время разрешены глобально, то процессор перейдет к соответствующему вектору прерывания в этом список, по завершении текущей инструкции.

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

Как только процессор переходит к обслуживанию прерывания, дальнейшие прерывания глобально блокируются. Они снова включаются автоматически, когда возвращается процедура обслуживания прерываний (ISR). (Эти замечания относятся к линейке процессоров AVR, процессоры SAM/ARM и Intel могут вести себя немного по-разному)

Некоторые прерывания уже обрабатываются библиотеками (например, библиотека millis для TIMER0_OVF_vect и библиотека HardwareSerial для USART_RX_vect, USART_UDRE_vect и USART_TX_vect). Однако, если вы пишете свои собственные, они обычно выглядят так:

ISR(WDT_vect)
  {
  // код обработки прерывания здесь
  }

Общие советы по написанию ISR

  • Сократите код ISR
  • Не используйте delay()
  • Не делайте последовательных отпечатков.
  • Сделать переменные общими с основным кодом volatile
  • Переменные, совместно используемые с основным кодом, могут нуждаться в защите с помощью «критических секций»
  • Не пытайтесь включать и отключать прерывания внутри ISR.

Вопросы, связанные с [isr]:

  • 1