인터럽트와 NVIC: 우선순위와 짧은 처리
우선순위 그룹, 선점과 서브 우선순위, 처리 함수를 짧게 유지하는 이유, 공유 변수를 안전하게 다루는 법.
NVIC 설정 세 가지
- 주변장치에서 인터럽트 허용 (예:
USART1->CR1 |= RXNEIE) - NVIC에서 그 인터럽트 번호 허용 (
NVIC_EnableIRQ(USART1_IRQn)) - 우선순위 설정 (
NVIC_SetPriority)
하나라도 빠지면 인터럽트가 들어오지 않습니다.
우선순위
STM32는 숫자가 작을수록 높은 우선순위입니다. 높은 인터럽트는 낮은 인터럽트 처리 중에도 끼어듭니다(선점).
| 인터럽트 | 우선순위 예 |
|---|---|
| 과전류 보호 | 0 (가장 높음) |
| 전류 제어 ADC 완료 | 1 |
| 통신 수신 | 5 |
| 버튼 | 10 |
RTOS를 쓰면 RTOS API를 부르는 인터럽트는 configMAX_SYSCALL_INTERRUPT_PRIORITY보다 낮은 우선순위여야 합니다.
처리 함수 원칙
- 플래그 세우기, 버퍼에 넣기, 레지스터 값 저장만 하고 나옵니다.
printf,HAL_Delay, 긴 계산 금지- 인터럽트 원인 플래그를 지웁니다
공유 변수
volatile uint32_t ticks;
uint32_t get_ticks(void) {
__disable_irq(); uint32_t t = ticks; __enable_irq(); // 32비트는 원자적이지만 구조체라면 필수
return t;
}
여러 바이트로 된 값이나 여러 변수를 한꺼번에 읽을 때는 잠깐 인터럽트를 끄거나 복사본을 씁니다.