마이크로컨트롤러가 무한 루프에 빠져 혼란스러워하는 상황😖. 작업을 수행하는 동안 마이크로컨트롤러가 멈추거나 걸리는 경우가 있나요😖. 일반적인 문제 해결 방법은? 리셋 버튼, 맞죠? 😕 매번 버튼을 누르는 것이 현실적으로 가능할까요? 이 작업을 자동으로 수행하는 장치가 있다면 어떨까요? 좋은 생각입니다. 쿨...! 🙂
네! 이제 마이크로컨트롤러 내부에 이미 있는 그런 장치에 대해 논의하겠습니다. 바로 워치독 타이머(Watchdog Timer)입니다.
"워치독 타이머(Watchdog Timer, WDT)는 메인 프로그램이 주기적으로 서비스하지 않으면 자동으로 시스템 리셋을 생성하는 하드웨어 타이머입니다. 소프트웨어 또는 하드웨어 결함으로 인해 멈추는 임베디드 장치를 자동으로 리셋하는 데 자주 사용됩니다." (os.mbed.com/cookbook/WatchDog-Timer).
개에게 먹이 주기!
집에 개가 있다고 상상해보세요. 정기적으로 개에게 먹이를 주어야 합니다. 하루라도 먹이를 주지 않으면 개가 물 것입니다! 워치독 타이머도 이와 비슷하게 작동합니다.
프로그램의 메인 부분은 반복 실행됩니다(loop). 워치독 타이머를 메인 프로그램의 총 지연보다 큰 초기값으로 로드하여 활성화합니다. 메인 프로그램이 실행될 때마다 이 타이머를 리셋합니다. 어떤 경우든 메인 프로그램이 타이머가 0으로 카운트다운되기 전에 돌아와 타이머를 리셋하지 않으면, 프로세서를 리셋하는 인터럽트가 발생합니다. 이렇게 워치독 타이머는 마이크로컨트롤러가 멈추는 것을 방지합니다.
이 함수는 워치독 타이머를 리셋하는 데 사용합니다. loop() 안에 리셋 함수를 사용하세요. 프로그램이 워치독 타이머의 임계 지연보다 큰 delay()를 사용하는 경우, 그 delay 앞에도 리셋 함수를 추가해야 합니다. 그렇지 않으면 해당 작업이 완료되기 전에 마이크로컨트롤러가 리셋됩니다.
워치독 타이머 비활성화
wdt_disable();
예제 코드
#include
void setup() {
Serial.begin(9600);
Serial.println("Setup started :");
// WDT 활성화 전 지연
// 이 지연은 모든 초기 작업 완료를 돕습니다
delay(2000);
wdt_enable(WDTO_4S);
}
void loop() {
Serial.println("LOOP started ! ");
for (int i = 0; i <= 5; i++) {
Serial.print("Loop : ");
Serial.print(i);
Serial.println();
delay(1000);
wdt_reset();
}
// MCU를 멈추게 하는 무한 루프
while (1) {}
}
출력 결과
피드백, 질문, 토론은 댓글 섹션에 남겨주세요.
코드
전체 코드 (Arduino)
#include
void setup() {
Serial.begin(9600);
Serial.println("Setup started :");
delay(2000);
wdt_enable(WDTO_4S);
}
void loop() {
Serial.println("LOOP started ! ");
for (int i = 0; i <= 5; i++) {
Serial.print("Loop : ");
Serial.print(i);
Serial.println();
delay(1000);
wdt_reset();
}
// MCU를 멈추게 하는 무한 루프
while (1) {}
}