WatchdogTimer 사용해보기

WatchdogTimer(워치독 타이머)



ESP32(M5Stack)와 Arduino에서 워치독 타이머의 동작을 확인한다. 모두 Arduino IDE를 이용하고 있지만, 워치독 타이머는 마이크로컴퓨터 의존의 부분이 많이 있어, 저레벨에서는 각각 다른 Function이 사용되고 있다. 또한, 양자 모두 정밀도에 차이가 있었기 때문에 그것도 기재한다.

워치독 내용



랜덤한 시간(1-2500ms) Sleep중, Sleep 개시로부터 2초 경과했을 경우, 워치독 타이머에 의해 리셋한다.

ESP32



참고 URL


  • 이해하기 쉬운 설명
  • ESP32 본가의 소스 코드

  • 소스 코드


    #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
    }
    
  • randomSeed()로 난수를 초기 설정.
  • 워치독 타이머 관련 초기화(핸들러 설정, Enable화 등).
  • timerWrite() 실행 후, timerAlarmWrite()로 지정한 시간(TIMEOUT * 1000 us)인 2초 후에 리셋(WatchdogTimer 실행)된다.
  • 1-2500ms 사이에서 Sleep(delay()).

  • 결과





    2072ms 때 리셋(WatchdogTimer 실행)하고 있는 것을 볼 수 있다.

    Arduino



    참고 URL


  • Arduino에서 워치독 타이머 사용
  • Arduino에서 소프트웨어 재설정

  • 소스 코드


    #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);
    }
    
    
  • randomSeed()로 난수를 초기 설정.
  • wdt_reset() 실행 후, wdt_enable()로 지정한 시간(WDTO_2S)인 2초 후에 리셋(WatchdogTimer 실행)된다.
  • 1-2500ms 사이에서 Sleep(delay()).

  • 결과





    2128ms에서는 리셋하지 않고, 2215ms에서는 리셋하고 있다. 몇 번이나 트라이한, 2초 이상으로 리셋하지 않은 케이스가, Arduino에서는 많이 볼 수 있었다. 정밀도가 나쁜 것일까? (상세 미조사)

    좋은 웹페이지 즐겨찾기