일반 워치독은 "늦으면 리셋"이지만, 윈도우 워치독은 "이르면도 리셋" 이다.
왜 이른 것도 막나
일반 워치독은 이런 고장을 못 잡는다.
while (1) { WDOG_feed(); } /* 코드가 폭주해 여기만 돌아도 워치독은 만족한다 */
주기가 무너진 것을 감지하지 못한다. 창(window)을 두면 "정상 주기로 돌고 있을 때만" 리프레시가 받아들여진다.
허용 창
├────────┼───────────┼────────► 시간
0 하한 상한
리셋 정상 리셋
어디서 먹이나 — 위치가 곧 설계다
volatile uint8_t alive_mask; /* 태스크마다 자기 비트를 세운다 */
void task_sensor(void) { measure(); alive_mask |= BIT_SENSOR; }
void task_comm(void) { send_can(); alive_mask |= BIT_COMM; }
void supervisor_10ms(void) {
if (alive_mask == (BIT_SENSOR | BIT_COMM)) { /* 전원 생존 확인 */
WDOG_refresh();
alive_mask = 0;
}
/* 하나라도 빠지면 먹이지 않는다 → 리셋 */
}
타이머 인터럽트에서 무조건 먹이는 코드는 최악이다. 태스크가 전부 죽어도 인터럽트만 살아 있으면 통과하므로, 감시 대상이 사라진다.
자동차에서 한 겹 더
MCU 내부 워치독은 MCU가 통째로 이상해지면 같이 죽을 수 있다. 그래서 외부 감시 칩(SBC 등)이 별도로 감시하고, 응답이 없으면 전원을 끊거나 리셋한다.