Wait For Interrupt. 할 일이 없으면 자는 것이 저전력의 시작이다.
for (;;) {
handle_pending_work();
__WFI(); /* 인터럽트가 올 때까지 CPU 정지 */
}
무엇이 멈추나
기본(슬립) 모드에서는 CPU 클럭만 멈춘다. 주변장치와 인터럽트는 계속 살아 있어서 UART 수신이나 타이머로 즉시 깨어난다. 더 깊은 모드로 갈수록 더 많은 것이 꺼진다.
슬립 CPU 정지 · 즉시 복귀
스톱 대부분의 클럭 정지 · 복귀에 시간이 든다 · RAM 유지
스탠바이 거의 전부 꺼짐 · 리셋처럼 깨어난다 · RAM 대부분 소실
놓치기 쉬운 함정
경쟁 조건 플래그를 확인한 직후 WFI 를 실행하기 전에 인터럽트가 오면
그 이벤트를 놓치고 잠들 수 있다 → 인터럽트를 막고 확인 후 WFI 하는 관용구를 쓴다
디버거 연결돼 있으면 저전력 모드 동작이 달라지고 전류도 다르게 측정된다
틱 인터럽트 1ms 마다 깨우면 깊은 잠을 못 잔다 → 틱리스 모드