WatchdogTimer 사용해보기
WatchdogTimer(워치독 타이머)
ESP32(M5Stack)와 Arduino에서 워치독 타이머의 동작을 확인한다. 모두 Arduino IDE를 이용하고 있지만, 워치독 타이머는 마이크로컴퓨터 의존의 부분이 많이 있어, 저레벨에서는 각각 다른 Function이 사용되고 있다. 또한, 양자 모두 정밀도에 차이가 있었기 때문에 그것도 기재한다.
워치독 내용
랜덤한 시간(1-2500ms) Sleep중, Sleep 개시로부터 2초 경과했을 경우, 워치독 타이머에 의해 리셋한다.
ESP32
참고 URL
소스 코드
#include "esp_system.h"
#define TIMEOUT 2000
hw_timer_t *timer = NULL;
void IRAM_ATTR resetModule() {
ets_printf("Reboot\n");
esp_restart();
}
void setup()
{
Serial.begin(115200);
randomSeed(millis());
timer = timerBegin(0, 80, true); //timer 0, div 80
timerAttachInterrupt(timer, &resetModule, true); //attach callback
timerAlarmWrite(timer, TIMEOUT * 1000, false); //set time in us
timerAlarmEnable(timer); //enable interrupt
Serial.println("Setup done");
}
void loop()
{
uint16_t val;
timerWrite(timer, 0); //reset timer (feed watchdog)
val = random(1, 2500);
Serial.printf("Sleep %d ms\n", val);
delay(val); // Process which might take time
}
결과
2072ms 때 리셋(WatchdogTimer 실행)하고 있는 것을 볼 수 있다.
Arduino
참고 URL
소스 코드
#include <avr/wdt.h>
void setup() {
Serial.begin(115200);
randomSeed(millis());
wdt_enable(WDTO_2S);
Serial.println("Setup done");
}
void loop() {
char buf[16];
uint16_t val;
wdt_reset();
val = random(1, 2500);
sprintf(buf, "Sleep %d ms", val);
Serial.println(buf);
delay(val);
}
결과
2128ms에서는 리셋하지 않고, 2215ms에서는 리셋하고 있다. 몇 번이나 트라이한, 2초 이상으로 리셋하지 않은 케이스가, Arduino에서는 많이 볼 수 있었다. 정밀도가 나쁜 것일까? (상세 미조사)
Reference
이 문제에 관하여(WatchdogTimer 사용해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/infinite1oop/items/7f94919d1e0d4cf7d18d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)