개발/BLE

ESP32 While 문에서 리셋 걸리는 현상 해결 (Task watchdog got triggered. )

FA1976 2025. 2. 6. 07:04
반응형

프로그램이 비 정상적으로 실행이 된다면 Monitor device를 실행시켜보시면 단번에 이러한 메시지가 출력이 될 경우가 있습니다.

난 워치독을 설정한게 없는데 왜 이 런 에러가 뜰까???

기본적으로 ESP32는 워치독을 내부에서 실행을 합니다.

일반적으로 while 문에서 어떠한 작업을 처리 하게 될텐데요.

반드시 워치독 리셋을 수행 해줘야 합니다.

    while (1) {
        // 메인 루프에서 추가적인 작업이 없으므로 대기 상태
        // 워치독 리셋
        esp_task_wdt_reset();
    }

그런데 위에서 처럼 달랑 저렇게 처리하면 하면 오류가 뜹니다. 워치독 리셋을 할게 없다고....엥? 뭔소리야...

그래서 어찌되었건 워치독 리셋을 새로 초기화 해줘야 합니다.

#define TWDT_TIMEOUT_MS         10000 //10s

void set_watchdog(void) 
{
    esp_task_wdt_config_t twdt_config = {
        .timeout_ms = TWDT_TIMEOUT_MS,
        .idle_core_mask = 0,    
        .trigger_panic = false,
    };

    ESP_ERROR_CHECK(esp_task_wdt_deinit());
    ESP_ERROR_CHECK(esp_task_wdt_init(&twdt_config));
    ESP_ERROR_CHECK(esp_task_wdt_add(NULL));       // 현재 태스크에 워치독 타이머 추가
}

위에서 처럼 새로 함수 하나 만들어서 app_main 시작 위치에 적용을 하면 되겠죠.

참고로 "idle_core_mask " 의 값은 0 인데 이것이 CPU0를 의미합니다.

ESP32-C3의 CPU0 밖에 없습니다. 단일 코어 이니까요. 만약에 코어가 여러개이면 워치독도 해당 코어에 맞게 설정을 해줘야 합니다.

esp_task_wdt_deinit 로 기존의 워치독을 중지하고, 새로 설정해서 시작합니다.

void app_main() {
    ESP_LOGI(TAG, "reset start.");
    set_watchdog();
    // ESP_ERROR_CHECK(esp_task_wdt_deinit());
    set_gpio();
    set_timer();

    ESP_LOGI(TAG, "LED Blink started.");
    
    // 메인 루프 (대기)
    while (1) {
        // 메인 루프에서 추가적인 작업이 없으므로 대기 상태
        // 워치독 리셋
        esp_task_wdt_reset();
    }
}

참 쉽죠.

-끝-

 
반응형

'개발 > BLE' 카테고리의 다른 글

ESP32 Monitor Device 사용하기  (0) 2025.02.06
ESP32 VScode에서 디버깅 하기  (0) 2025.02.06
ESP32 컴파일러 설치 (VScode)  (0) 2025.02.06
Measuring Bluetooth® Low Energy Power Consumption  (0) 2016.07.11
Reprogramming the CC2540 USB Dongle in the CC2540DK  (0) 2016.07.11
BLE 란?  (0) 2016.07.07
약어정리 - octets  (0) 2016.07.07
약어 정리 - MTU  (0) 2016.07.07