"기다린다" 를 "지금 어디까지 왔는지 기억한다" 로 바꾸는 것이다.
/* 블로킹 — 루프 전체가 멈춘다 */
send_cmd(); delay_ms(50); read_result();
/* 상태 기계 — 매 호출마다 조금씩 진행한다 */
switch (st) {
case IDLE: send_cmd(); t0 = now_ms(); st = WAIT; break;
case WAIT: if (now_ms() - t0 >= 50) st = READ; break;
case READ: read_result(); st = IDLE; break;
}
얻는 것
- 루프가 매번 빠르게 한 바퀴 돈다 → 다른 작업이 밀리지 않는다
- 타임아웃을 자연스럽게 넣을 수 있다 — 상태마다 진입 시각을 기록해 두면 된다
- 통신 프로토콜 파싱처럼 단계가 있는 일에 그대로 들어맞는다
실무 팁
상태를 열거형으로 두고 전이 표를 주석이나 문서로 남긴다. 상태가 늘어나면 표가 없이는 유지가 안 되고, 이 표가 곧 테스트 케이스 목록이 된다.