인터럽트와 예외: 하던 일을 멈추고 다녀오기
이벤트가 생기면 CPU가 상태를 저장하고 처리 루틴으로 뛰었다가 돌아옵니다. Cortex-M에서 그 과정이 어떻게 일어나는지 정리했습니다.
버튼이 눌렸는지 계속 확인하는 폴링은 CPU를 낭비하고 반응도 늦습니다. 인터럽트는 하드웨어가 "일이 생겼다"고 CPU를 불러 세우는 방식입니다.
Cortex-M에서 일어나는 일
- 주변장치가 인터럽트 신호를 올린다
- NVIC가 우선순위를 확인하고 CPU에 알린다
- CPU가 r0~r3, r12, lr, pc, xPSR을 자동으로 스택에 저장한다
- 벡터 테이블에서 처리 함수 주소를 찾아 점프한다
- 처리 함수가 끝나면 저장했던 레지스터를 복원하고 원래 자리로 돌아간다
레지스터 저장이 하드웨어로 자동 처리되기 때문에 Cortex-M의 인터럽트 함수는 보통 C 함수와 똑같이 씁니다.
예외
인터럽트는 예외의 한 종류입니다. 리셋, NMI, 하드폴트, SysTick, SVCall도 모두 예외이고 벡터 테이블 앞쪽에 자리가 있습니다. 잘못된 주소 접근이나 0으로 나누기 같은 문제가 생기면 하드폴트 예외로 들어갑니다.
처리 함수 작성 원칙
- 짧게. 플래그를 세우거나 버퍼에 넣고 끝냅니다.
- 메인 코드와 공유하는 변수는
volatile로, 여러 바이트 값은 원자적으로 읽히게 보호합니다. - 인터럽트 원인 플래그를 지우지 않으면 함수가 끝나자마자 다시 들어옵니다.