| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- /* 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");
- }
|