통합 차량 관제 시스템 용어 사전
제어·구동ISR · 인터럽트

ISR

Interrupt Service Routine. 인터럽트가 걸렸을 때 실행되는 함수. 짧게 유지해야 한다.

하드웨어 이벤트(타이머 만료, 통신 수신, 엣지 입력)가 발생하면 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)한다. 그리고 임계 구역은 대입 한 줄 수준으로 짧게 유지해야 한다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 파워윈도우 — 요청 우선순위·위치·Anti-pinch