§6.4.2 의 "Fan 제어 기능 간 전환" 소절이 요구하는 것이다. 세 기능이 Fan 을 다툰다 — 목표 온도 자동 공조, 사용자 공기 순환, Pre-conditioning.
세 요구사항이 만드는 규칙
① 다른 Fan 제어 기능의 새 유효 요청이 확인되면 기존 동작을 종료하고 새 요청을 반영한다
② 사용자의 새 유효 요청을 수행 중인 Pre-conditioning 보다 우선 처리한다
③ 새 기능으로 전환된 이후 이전 기능의 Fan 출력을 자동으로 재개하지 않는다
③이 핵심 — 종료이지 일시정지가 아니다
구현상 이전 기능의 상태를 저장해 두지 말라는 뜻이다.
/* ✗ 요구사항 위반 — 자동 재개 경로를 만들었다 */
static fan_level_t g_saved_level;
void fan_release(void) { fan_output_apply(g_saved_level); }
저장할 자리를 만들지 않으면 위반이 구조적으로 불가능해진다. 표시 우선순위 에서 "매 주기 최우선을 다시 고르는" 구조를 택한 것과 같은 발상이다.
상태를 하나로 묶어야 하는 이유
소유자와 듀티를 따로 쓰면 그 사이에 ISR 이 끼어들어 "새 소유자 + 옛 듀티" 조합을 볼 수 있다. 각각 volatile 인 건 도움이 안 된다 — volatile 은 각 접근을 보장하지만 두 접근 사이의 원자성은 보장하지 않는다.
typedef struct { fan_owner_t owner; uint16_t duty; } fan_state_t;
static volatile fan_state_t g_fan; /* 통째로 교체한다 */