상태 머신과 오류 복구
대기·측정·전송·복구 흐름을 정의하고 오래된 센서 값의 사용을 막습니다.
진도 0%
레슨
- 상태 전이표 실행하기
상태·이벤트 입력을 전이표로 처리하여 다음 상태와 동작을 출력합니다.
- 시간 초과와 재시도 한도
20ms 시간 초과 뒤 최대 3회 시도하고 실패하면 오류 상태로 전이합니다.
- 잡음과 오래된 값
길이 3 이동평균을 구하고 300ms 지난 샘플을 STALE로 표시합니다.
- 복구와 안전한 상태 표시
센서 분리 때 측정값 전송을 중지하고 복구 이벤트 뒤 새 샘플로 재개합니다.
상태 머신과 오류 복구 미션
m06-sensor-buses의 산출물을 이어받습니다. 독립 starter에도 직전 모듈의 검증된 산출물을 포함합니다. 센서 기록기와 상태 표시 장치를 PC에서 완성합니다.
요구사항
- 통신 기록기를 IDLE·MEASURE·TRANSMIT·RECOVER·ERROR 상태로 구성하고 재시도·오래된 값·오류 LED 정책을 추가합니다.
- C 코드는 gcc -std=c11 -Wall -Wextra -Werror로 빌드하고 Python 보조 코드는 표준 라이브러리만 사용합니다.
- m06 embedded-sensor-buses의 solution 소스·회귀를 보존합니다. 새 메인 경로는 timed_button → timer_poll → recovery_tick이며 bus_consume을 중복 소비자로 호출하지 않습니다.
- 최초 요청 포함 총 3회, 실패 후 100ms 휴지, 20ms 응답 성공 우선·무응답 경과20ms 종료를 구현합니다. NACK·시간 초과만 한도 내 재시도하며 설정·용량 오류는 ERROR입니다.
- 최근 성공 온도 3개를 실제 개수로 평균하고 0 방향 버림합니다. 공개 시 나이300ms 이상을 차단하며 오류·정지·재연결 시 창과 valid를 비웁니다.
- 명시 recovery_reconnect는 큐·창·예산을 초기화하지만 Buffer·SPI·기존 UART 기록을 보존합니다. LED는 유효 최근 값 켜짐, 복구·오래됨 꺼짐, ERROR 100ms 구간 번갈아 표시입니다.
- RECOVERY-SPEC.md와 실제 실행 증거 RECOVERY-EVIDENCE.md를 제출하고 실물 연결 감지·요청 응답 보존·물리 전송 원자성·LED 주기는 후속 검증으로 구분합니다.
완료 기준
- 미션 압축 해제 디렉터리에서 make test가 종료 코드 0으로 끝나고 기존 모듈의 회귀 검사도 통과합니다.
- 20ms에 도착한 응답은 성공하고 21ms 예정 무응답은 경과20ms에 종료합니다. 총3회 실패 뒤 ERROR 유지, 분리 중 기록 없음, 명시 재연결 후 새 이벤트·새 샘플로 복귀합니다.
- make -s recovery-test가 state-recovery 실패0, make -s test로 기존 sensor-buses 79건과 retry-budget 11건도 실패0입니다.
- recovery-demo는 분리 전2개 기록을 보존하고 재연결 뒤 새 10000밀리도로 시작하여 최종 records=5 spi=65입니다. 나이299 공개·300 차단, SPI full 뒤 CS 해제와 출력 보존을 검사합니다.
make test미션 시작 코드
모범 답안
모범 답안 내려받기검토 기준
- 요구사항과 테스트 fixture의 대응이 드러납니다.
- 하드웨어 의존 경계와 실패 처리의 선택 이유를 설명합니다.
- 미션별 측정·관찰 증거를 실제 실행한 결과로 남깁니다.