하드웨어 이벤트(타이머 만료, 통신 수신, 엣지 입력)가 발생하면 CPU 가 하던 일을 멈추고 이 함수로 점프한다.
왜 짧아야 하나
ISR 이 도는 동안 같거나 낮은 우선순위의 인터럽트는 대기한다. 여기서 계산하거나 로그를 남기면 그만큼 다른 인터럽트가 밀린다.
이 프로젝트에서 가장 급한 것은 Anti-pinch 감지다 — 1 ms 주기로 전류·속도를 보고 끼임을 판정하는데, 다른 ISR 이 오래 잡고 있으면 그 판정이 늦어진다.
그래서 이렇게 나눈다
void PWM_FAULT_TIMER_IRQHandler(void)
{
if (g_dir == WIN_DIR_CLOSE && pinch_detected(i, p, sp)) {
motor_brake(); /* ① 정지까지만 — 즉시 */
g_pinch_latched = true;
g_state = WIN_ST_PROTECTING; /* ② 보호 구동은 메인 루프가 이어받는다 */
}
}
보호 구동은 수백 ms 가 걸리므로 ISR 에 둘 수 없다. ISR 은 판정하고 플래그만 세운다.
메인 루프와 상태를 공유할 때
ISR 은 블록될 수 없어서 RTOS 뮤텍스를 쓸 수 없다. 임계 구역이 필요하면 인터럽트를 잠깐 끄거나(PRIMASK), 우선순위 기준으로 선택 차단(BASEPRI)한다. 그리고 임계 구역은 대입 한 줄 수준으로 짧게 유지해야 한다.