3.27. 워치독 타이머¶
워치독 타이머는 실행 중인 스크립트가 주기적으로 건드리는 것을 멈추면 마이크로컨트롤러를 리셋하는 하드웨어입니다. 스크립트는 정상적으로 동작하는 코드가 실행되고 있다고 확신하는 곳에서 워치독에 “먹이를 줍니다”. 만약 버그나 행, 예기치 못한 예외 때문에 구성된 타임아웃 안에 카메라가 워치독에 먹이를 주지 못하면, 칩은 스스로 리셋되고 스크립트는 처음부터 다시 시작됩니다.
전원을 재인가해 줄 사람이 곁에 없는 배포된 장치에서는, 이것이 몇 초 만에 복구되는 일시적 버그와 서비스 출동이 필요한 벽돌 상태 사이의 차이를 만듭니다.
워치독 카운터는 타임아웃 값에서부터 줄어듭니다. feed()를 호출할 때마다 다시 채워지며, 0에 도달하면 칩이 리셋됩니다.¶
3.27.1. machine.WDT 클래스¶
machine.WDT는 워치독을 활성화하고 단일 메서드 feed()를 제공합니다. 한 번 시작된 워치독은 멈출 수 없습니다. 빠져나갈 유일한 방법은 일정에 맞춰 먹이를 주거나 칩을 리셋하도록 두는 것뿐입니다:
from machine import WDT
wdt = WDT(timeout=2000) # reset if not fed within 2 seconds
while True:
do_work()
wdt.feed()
timeout은 밀리초 단위입니다. 적절한 값은 메인 루프의 가장 긴 정상 반복이 얼마나 걸리는지에 충분한 여유를 더해 결정됩니다. 100ms 루프에 2초 타임아웃이면 느린 반복에도 불필요한 리셋 없이 여유가 충분합니다.
3.27.2. feed()를 호출할 위치¶
feed()가 어디에 위치하는지가 핵심적인 설계 결정입니다. 워치독은 먹이를 주는 사이에 실행되지 않는 코드 부분의 버그만 잡아냅니다.
메인 루프의 맨 위 또는 맨 아래에서 호출하세요. 가장 흔한 패턴입니다. 워치독은 메인 루프를 멈추게 하는 모든 것(데드락, 무한
while, 결코 반환하지 않는 주변장치)을 잡아 칩을 리셋해 루프로 되돌립니다.인터럽트 핸들러에서 호출하지 마세요. 워치독의 핵심은 정상 코드 경로의 행을 잡는 것입니다. 메인 루프가 멈췄든 말든 발생하는 ISR은 트리거되어야 할 워치독에 계속 먹이를 주게 됩니다.
긴 블로킹 연산 안에서 호출하지 마세요. 10초가 걸리는 네트워크 요청이나 센서 읽기야말로 워치독이 잡아내야 할 종류의 행입니다. 그 안에
feed()를 넣으면 보호가 무력화됩니다.
대부분의 프로그램에 통하는 지침: 메인 루프 반복당 한 번 먹이를 주고, 타임아웃은 예상 루프 지속 시간의 몇 배로 설정하세요. 단일 반복이 정당하게 타임아웃보다 더 오래 걸린다면(예를 들어 의도적인 보정 단계), 그 단계를 feed()를 사이에 둔 더 작은 청크들의 연속으로 구성하거나, 진입 전에 (지원되는 경우) timeout_ms()로 타임아웃을 변경하세요.
3.27.3. 지원 여부¶
워치독은 대부분의 OpenMV 카메라에서 제공되지만 전부는 아닙니다. 하드웨어는 모든 부품에 있지만, Python API가 아직 모든 곳에 연결되어 있지는 않습니다. OpenMV 보드를 확인하거나, WDT를 생성해 보고 지원되지 않으면 발생하는 AttributeError를 잡아내 보세요.
WDT가 제공되지 않는 카메라에서도, 현장에 배포된 장치는 소프트웨어적 등가물을 사용할 수 있습니다. 진행 상황을 모니터링하고 무언가 멈춘 것처럼 보이면 machine.reset()을 트리거하는 별도 태스크나 메인 루프 단계가 그것입니다. 하드웨어 워치독보다는 견고하지 않지만(멈춘 인터럽트 핸들러가 소프트 모니터까지 무너뜨릴 수 있음) 애플리케이션 수준에서 동일한 경우를 커버합니다.