Devin.KR

타이머·인터럽트와 주기 수집

가상 시간으로 주기 작업을 만들고 인터럽트의 긴 처리를 메인 루프로 옮깁니다.

진도 0%

레슨

  1. 주기와 마감 시간

    이벤트 시각에서 100ms 주기의 예정 시각과 지연을 계산합니다.

  2. 타이머 HAL과 시간 순환

    uint32_t 차이 계산으로 타이머 순환을 지나도 수집 주기를 유지합니다.

  3. 짧은 인터럽트와 이벤트 큐

    가상 ISR은 시각과 이벤트만 큐에 넣고 측정·출력은 루프에서 수행합니다.

  4. PWM 상태 표시

    가상 PWM의 duty와 주기를 검사하고 기록 상태별 LED 밝기를 바꿉니다.

타이머·인터럽트와 주기 수집 미션

m04-gpio-button의 산출물을 이어받습니다. 독립 starter에도 직전 모듈의 검증된 산출물을 포함합니다. 센서 기록기와 상태 표시 장치를 PC에서 완성합니다.

요구사항

  • 버튼 기록기에 100ms 타이머·가상 ISR·용량 8 이벤트 큐를 추가하고 출력 작업을 인터럽트 밖에 둡니다.
  • C 코드는 gcc -std=c11 -Wall -Wextra -Werror로 빌드하고 Python 보조 코드는 표준 라이브러리만 사용합니다.
  • events.c의 순환 비교·full 손실 계수·PWM duty 저장을 구현합니다. 기존 controller_step과 회귀는 보존하고 새 경로는 timed_button → timer_poll → timed_consume 순서로 사용합니다.
  • 연속 timer_poll 간격 0~1000ms, 첫 예정 init+100ms, full은 새 이벤트 거부·계수, 실제 샘플 timestamp는 소비 시각이라는 계약을 문서화합니다.
  • 가상 ISR은 순차 호출 모델입니다. 실제 공유 큐의 원자성·임계 구역·ISR 실행 시간은 실물 후속 검증 항목으로 구분합니다.

완료 기준

  • 미션 압축 해제 디렉터리에서 make test가 종료 코드 0으로 끝나고 기존 모듈의 회귀 검사도 통과합니다.
  • 0~1000ms에서 100~1000ms 수집 10회이고 uint32_t 순환에서도 주기가 유지되며 큐 초과는 계수되고 ISR 경로에 파일 출력·대기 호출이 없습니다.
  • timer-events: 91 cases, 0 failures이며 큐 10개 생성에서 8개 보존·2개 손실, FIFO 재사용, PWM 33% 요청의 30% 실현, 정지 확정 반복의 저장 생략을 검사합니다.
make test
미션 시작 코드
모범 답안모범 답안 내려받기

검토 기준

  • 요구사항과 테스트 fixture의 대응이 드러납니다.
  • 하드웨어 의존 경계와 실패 처리의 선택 이유를 설명합니다.
  • 미션별 측정·관찰 증거를 실제 실행한 결과로 남깁니다.