This commit reverts the revert on the new task watchdog API. It also fixes the following bug which caused the reversion. - sdkconfig TASK_WDT_TIMEOUT_S has been reverted from the unit of ms back to the unit of seconds. Fixes bug where projects using the new API without rebuilding sdkconfig would cause the old default value of 5 to be interpreted in ms. This commit also adds the following features to the task watchdog - Updated idle hook registration to be compatible with dual core hooks - Updated dual core hooks to support deregistration for cpu - Legacy mode has been removed and esp_task_wdt_feed() is now replaced by esp_task_wdt_reset(). esp_task_wdt_feed() is deprecated - Idle hooks to reset are now registered/deregistered when the idle tasks are added/deleted from the Task Watchdog instead of at Task Watchdog init/deinit - Updated example
85 lines
3.3 KiB
C
85 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()
|
|
{
|
|
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_TASK_WDT_CHECK_IDLE_TASK_CPU0
|
|
esp_task_wdt_add(xTaskGetIdleTaskHandleForCPU(0));
|
|
#endif
|
|
#ifndef CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1
|
|
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");
|
|
}
|