ESP32-任务看门狗笔记
看门狗机制用于监控嵌入式系统运行并在发生不可知的软硬件故障时将系统复位。系统正常运行时,看门狗定时器溢出之前会被重置计数值,也就是“喂狗”。定时器溢出意味着无法“喂狗”,系统异常。
基于ESP-IDF4.1
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "freertos/FreeRTOS.h"
4 #include "freertos/task.h"
5 #include "esp_task_wdt.h"
6
7 #define TWDT_TIMEOUT_S 3
8 #define TASK_RESET_PERIOD_S 2
9
10 /*
11 * 检查任务看门狗输出的宏,并在返回错误代码的时候触发中止
12 */
13 #define CHECK_ERROR_CODE(returned, expected) ({ \
14 if(returned != expected){ \
15 printf("TWDT ERROR\n"); \
16 abort(); \
17 } \
18 })
19
20 static TaskHandle_t task_handles[portNUM_PROCESSORS];
21
22 //用户任务的回调函数
23 void reset_task(void *arg)
24 {
25 //将任务添加到任务看门狗,并检查是否已添加
26 CHECK_ERROR_CODE(esp_task_wdt_add(NULL), ESP_OK);
27 CHECK_ERROR_CODE(esp_task_wdt_status(NULL), ESP_OK);
28
29 while(1){
30 //每2秒重置一次看门狗
31 CHECK_ERROR_CODE(esp_task_wdt_reset(), ESP_OK); //注释这一行可以触发看门狗超时
32 vTaskDelay(pdMS_TO_TICKS(TASK_RESET_PERIOD_S * 1000));
33 }
34 }
35
36 void app_main(void)
37 {
38 printf("Initialize TWDT\n");
39 //初始化和重新初始化任务看门狗
40 CHECK_ERROR_CODE(esp_task_wdt_init(TWDT_TIMEOUT_S, false), ESP_OK);
41
42 //启动时未订阅空闲任务,则订阅到任务看门狗
43 #ifndef CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0
44 esp_task_wdt_add(xTaskGetIdleTaskHandleForCPU(0));
45 #endif
46 #ifndef CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1
47 esp_task_wdt_add(xTaskGetIdleTaskHandleForCPU(1));
48 #endif
49
50 //创建用户任务并添加到任务看门狗
51 for(int i = 0; i < portNUM_PROCESSORS; i++){
52 xTaskCreatePinnedToCore(reset_task, "reset task", 1024, NULL, 10, &task_handles[i], i);
53 }
54
55 printf("Delay for 10 seconds\n");
56 vTaskDelay(pdMS_TO_TICKS(10000)); //延迟10秒
57
58 printf("Unsubscribing and deleting tasks\n");
59 //从任务监视程序中删除并取消订阅用户任务,然后取消订阅空闲任务
60 for(int i = 0; i < portNUM_PROCESSORS; i++){
61 vTaskDelete(task_handles[i]); //首先删除用户任务(防止重置未订阅的任务)
62 CHECK_ERROR_CODE(esp_task_wdt_delete(task_handles[i]), ESP_OK); //从任务看门狗取消订阅任务
63 CHECK_ERROR_CODE(esp_task_wdt_status(task_handles[i]), ESP_ERR_NOT_FOUND); //确认任务已经取消订阅
64
65 //取消订阅空闲任务
66 CHECK_ERROR_CODE(esp_task_wdt_delete(xTaskGetIdleTaskHandleForCPU(i)), ESP_OK); //从任务看门狗取消订阅空闲任务
67 CHECK_ERROR_CODE(esp_task_wdt_status(xTaskGetIdleTaskHandleForCPU(i)), ESP_ERR_NOT_FOUND); //确认空闲人取消订阅
68 }
69
70
71 //取消订阅所有任务后,取消初始化任务看门狗
72 CHECK_ERROR_CODE(esp_task_wdt_deinit(), ESP_OK);
73 CHECK_ERROR_CODE(esp_task_wdt_status(NULL), ESP_ERR_INVALID_STATE); //确认任务看门狗取消初始化
74
75 printf("Complete\n");
76 }
原文:https://gitee.com/EspressifSystems/esp-idf/tree/master/examples/system/task_watchdog
ESP32-任务看门狗笔记的更多相关文章
- nRF51822 看门狗和OTA (无线升级功能)的尴尬笔记
很久没有记笔记了.今天要记点东西,不然以后又忘记了. 随着时代的发展,现在的SDK已经是13.0了.蓝牙5.0也就来了.废话就少说了,记笔记吧. 两年前搞过nRF51822 的无线升级功能,那时候用的 ...
- CC2540开发板学习笔记(八)—— 看门狗
一.功能: 防止程序跑飞,使得系统重新进入工作状态,即一种复位操作吧. 但需要不停地喂狗= =(就是不断的执行某种操作),假如说你的程序跑到了不知道哪里去的错误时,即不会实现喂狗,就会发生复位,程序就 ...
- Kubernetes 笔记 09 DaemonSet 我是一只看门狗
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Hi,大家好, ...
- 【小梅哥SOPC学习笔记】给NIOS II CPU增加看门狗定时器并使用
给NIOS II CPU增加看门狗定时器并使用 配置看门狗定时器: 1. 设置计时溢出时间为1秒 2. 计数器位宽为32位 3. 勾选No Start/Stop control bits 4. 勾选F ...
- STM32F407 窗口看门狗 个人笔记
窗口看门狗的喂狗时间范围 由框图知: 复位条件是:当且仅当 { 启动位启动 且 { T6为0 (计数器的值减小到0X03F即下限,还没喂狗,即喂狗太晚) 或 计数器的值高于上限时喂狗,即喂狗太早 } ...
- STM32F407 独立看门狗 个人笔记
什么是看门狗 如果程序跑飞了怎么办? 可以用看门狗来监控. 看门狗是: 一个递减的计数器,如果不按时给计数器赋值,计数器的值减到一定程度,就会使系统复位. 也就是说如果程序运行异常,无法正常给计数器赋 ...
- 5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
- S5PV210时钟,看门狗定时器
晶振:时钟源(操作主要有两个,倍频,分频) A8的时钟源: 时钟域,每个时钟域(不同的最高频率和最低频率)管理着不同的电路模块: 不同的时钟域对应不同电路模块表 时钟电路:懂得看时钟电路(时钟源选择开 ...
- 突然地心血来潮,为 MaixPy( k210 micropython ) 添加看门狗(WDT) C 模块的开发过程记录,给后来的人做开发参考。
事情是前几天群里有人说做个看门狗不难吧,5分钟的事情,然后我就怼了几句,后来才发现,原来真的没有看门狗模块鸭. 那好吧,那我就写一下好了,今天是(2020年4月30日)想着最后一天了,不如做点什么有价 ...
随机推荐
- js闭包和包装类
闭包 内部函数被返回到外部,函数本身保留了父函数的AO,即使父元素执行完了,取消对AO的引用,但依旧被子函数保留下来了,就形成了闭包. 闭包会导致原有作用域链不释放,造成内存泄漏. 作用 实现公有变量 ...
- Spring框架两大核心机制(IoC、AOP)
IoC(控制反转)/ DI(依赖注入) AOP(面向切面编程) Spring 是一个企业级开发框架,是软件设计层面的框架,优势在于可以将应用程序进行分层,开发者可以自主选择组件. MVC:Struts ...
- Python+Selenium - windows安全中心的弹窗(账号登录)
当出现如下图所示的 Windows安全中心弹窗,需要输入用户名和密码时 如何用Python+selenium跳过这个登录. 步骤: 1.在注册表中三个位置各添加两个东西:iexplore.exe 和 ...
- Camera Lens Coating
Camera Lens Coating Coating Progress 转换镜头,根据要求进行OEM和设计. 光学元件:望远镜.显微镜.相机和数码相机镜头.放大镜头和远摄镜头.定心镜头.投影镜头.投 ...
- NVIDIA GPU上的随机数生成
NVIDIA GPU上的随机数生成 NVIDIA CUDA随机数生成库(cuRAND)提供高性能的GPU加速的随机数生成(RNG).cuRAND库使用NVIDIA GPU中提供的数百个处理器内核,将质 ...
- Samsung WLAN AP RCE漏洞及利用工具
1.漏洞详情: 三星 WLAN AP WEA453e 路由器 远程命令执行 2.fofa语句 title=="Samsung WLAN AP" 3.复现 payload: POST ...
- Vue3中toRefs的使用
1 使用reactive 实现数据的响应式 <template> <div> <h2>toRef的使用</h2> <p> 姓名:{{stat ...
- 【C++】map容器的用法
检测map容器是否为空: 1 #include <iostream> 2 #include<map> 3 #include<string> 4 using name ...
- itools安装程序无法创建临时文件夹
做个记录: itools链接ios设备后,安装程序包时提示:无法创建临时文件夹 主要原因可能有以下几点 1.手机储存空间不足. 2.驱动组建被删除了,重启管理软件会自动跟新驱动. 解决办法:1.清除空 ...
- Java知识,面试总会问到虚拟机,虚拟机类加载机制你懂吗?
虚拟机把描述类的数据从Class文件文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 与那些在编译时需要进行连接工作的语言不同 ...