mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 06:11:06 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			86 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Task_Watchdog Example
 | 
						|
 | 
						|
   This example code is in the Public Domain (or CC0 licensed, at your option.)
 | 
						|
 | 
						|
   Unless required by applicable law or agreed to in writing, this
 | 
						|
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 | 
						|
   CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
*/
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include "freertos/FreeRTOS.h"
 | 
						|
#include "freertos/task.h"
 | 
						|
#include "esp_task_wdt.h"
 | 
						|
 | 
						|
#define TWDT_TIMEOUT_S          3
 | 
						|
#define TASK_RESET_PERIOD_S     2
 | 
						|
 | 
						|
/*
 | 
						|
 * Macro to check the outputs of TWDT functions and trigger an abort if an
 | 
						|
 * incorrect code is returned.
 | 
						|
 */
 | 
						|
#define CHECK_ERROR_CODE(returned, expected) ({                        \
 | 
						|
            if(returned != expected){                                  \
 | 
						|
                printf("TWDT ERROR\n");                                \
 | 
						|
                abort();                                               \
 | 
						|
            }                                                          \
 | 
						|
})
 | 
						|
 | 
						|
static TaskHandle_t task_handles[portNUM_PROCESSORS];
 | 
						|
 | 
						|
//Callback for user tasks created in app_main()
 | 
						|
void reset_task(void *arg)
 | 
						|
{
 | 
						|
    //Subscribe this task to TWDT, then check if it is subscribed
 | 
						|
    CHECK_ERROR_CODE(esp_task_wdt_add(NULL), ESP_OK);
 | 
						|
    CHECK_ERROR_CODE(esp_task_wdt_status(NULL), ESP_OK);
 | 
						|
 | 
						|
    while(1){
 | 
						|
        //reset the watchdog every 2 seconds
 | 
						|
        CHECK_ERROR_CODE(esp_task_wdt_reset(), ESP_OK);  //Comment this line to trigger a TWDT timeout
 | 
						|
        vTaskDelay(pdMS_TO_TICKS(TASK_RESET_PERIOD_S * 1000));
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void app_main(void)
 | 
						|
{
 | 
						|
    printf("Initialize TWDT\n");
 | 
						|
    //Initialize or reinitialize TWDT
 | 
						|
    CHECK_ERROR_CODE(esp_task_wdt_init(TWDT_TIMEOUT_S, false), ESP_OK);
 | 
						|
 | 
						|
    //Subscribe Idle Tasks to TWDT if they were not subscribed at startup
 | 
						|
#ifndef CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0
 | 
						|
    esp_task_wdt_add(xTaskGetIdleTaskHandleForCPU(0));
 | 
						|
#endif
 | 
						|
#if CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 && !CONFIG_FREERTOS_UNICORE
 | 
						|
    esp_task_wdt_add(xTaskGetIdleTaskHandleForCPU(1));
 | 
						|
#endif
 | 
						|
 | 
						|
    //Create user tasks and add them to watchdog
 | 
						|
    for(int i = 0; i < portNUM_PROCESSORS; i++){
 | 
						|
        xTaskCreatePinnedToCore(reset_task, "reset task", 1024, NULL, 10, &task_handles[i], i);
 | 
						|
    }
 | 
						|
 | 
						|
    printf("Delay for 10 seconds\n");
 | 
						|
    vTaskDelay(pdMS_TO_TICKS(10000));   //Delay for 10 seconds
 | 
						|
 | 
						|
    printf("Unsubscribing and deleting tasks\n");
 | 
						|
    //Delete and unsubscribe Users Tasks from Task Watchdog, then unsubscribe idle task
 | 
						|
    for(int i = 0; i < portNUM_PROCESSORS; i++){
 | 
						|
        vTaskDelete(task_handles[i]);   //Delete user task first (prevents the resetting of an unsubscribed task)
 | 
						|
        CHECK_ERROR_CODE(esp_task_wdt_delete(task_handles[i]), ESP_OK);     //Unsubscribe task from TWDT
 | 
						|
        CHECK_ERROR_CODE(esp_task_wdt_status(task_handles[i]), ESP_ERR_NOT_FOUND);  //Confirm task is unsubscribed
 | 
						|
 | 
						|
        //unsubscribe idle task
 | 
						|
        CHECK_ERROR_CODE(esp_task_wdt_delete(xTaskGetIdleTaskHandleForCPU(i)), ESP_OK);     //Unsubscribe Idle Task from TWDT
 | 
						|
        CHECK_ERROR_CODE(esp_task_wdt_status(xTaskGetIdleTaskHandleForCPU(i)), ESP_ERR_NOT_FOUND);      //Confirm Idle task has unsubscribed
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    //Deinit TWDT after all tasks have unsubscribed
 | 
						|
    CHECK_ERROR_CODE(esp_task_wdt_deinit(), ESP_OK);
 | 
						|
    CHECK_ERROR_CODE(esp_task_wdt_status(NULL), ESP_ERR_INVALID_STATE);     //Confirm TWDT has been deinitialized
 | 
						|
 | 
						|
    printf("Complete\n");
 | 
						|
}
 |