preemption. 중첩 인터럽트를 가능하게 하는 성질이다.
낮은 우선순위 ISR 실행 중
↓ 높은 우선순위 인터럽트 발생
→ 즉시 그쪽으로 넘어간다
→ 끝나면 원래 ISR 로 돌아와 이어서 실행
Cortex-M 은 이 전환을 하드웨어가 처리하므로 코드가 신경 쓸 것이 없다.
설계에서 정하는 것
급한 것을 높게 모터 전류 보호, 통신 수신 → 높은 우선순위
느린 것을 낮게 로그 전송, 화면 갱신 → 낮은 우선순위
우선순위를 다 같게 두면 선점이 일어나지 않는다 — 먼저 들어온 것이 끝나야 다음이 실행된다. 그러면 급한 인터럽트가 느린 것 뒤에 줄을 서게 된다.
대가
선점이 생기면 공유 데이터 문제가 커진다. 낮은 ISR 이 자료구조를 반쯤 고친 상태에서 높은 ISR 이 같은 자료구조를 보면 깨진 값을 읽는다.
임계 구역을 짧게 두거나
자료구조를 우선순위별로 분리하거나
락 없는 구조(단일 생산자 링 버퍼)를 쓴다
스택도 늘어난다
중첩되면 스택 사용이 겹쳐 쌓인다. 최악의 중첩 깊이를 가정해 스택을 잡아야 한다.