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日)想着最后一天了,不如做点什么有价 ...
随机推荐
- .NET Core中插件式开发实现
前言: 之前在文章- AppDomain实现[插件式]开发 中介绍了在 .NET Framework 中,通过AppDomain实现动态加载和卸载程序集的效果. 但是.NET Core 仅支持单个默认 ...
- 【分布式】-- 微服务抽奖系统后台整合MyBatis-Plus
1.整合MyBatis-Plus背景 [分布式]-- 基于Nacos.OpenFeign搭建的微服务抽奖系统后台小案例 本篇是基于上一篇博文微服务抽奖系统后台对持久层MyBatis进行更换,并整合My ...
- [Django高级之Auth模块]
[Django高级之Auth模块] auth模块 ←详情点击查看 1.Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统 ...
- 做个地道的c++程序猿:copy and swap惯用法
如果你对外语感兴趣,那肯定听过"idiom"这个词.牛津词典对于它的解释叫惯用语,再精简一些可以叫"成语".想要掌握一门语言,其中的"成语" ...
- 友盟umeng消息推送直接复制就能用(纯干货)
一. 单播推送(unicast) 1.1 图 1.2 代码 1 /** 2 * 根据设备的deviceToken, 去给指定的设备推送消息 3 * 4 * @param deviceToken 单个d ...
- GO学习-(3) VS Code配置Go语言开发环境
VS Code配置Go语言开发环境 VS Code配置Go语言开发环境 说在前面的话,Go语言是采用UTF8编码的,理论上使用任何文本编辑器都能做Go语言开发.大家可以根据自己的喜好自行选择.编辑器/ ...
- GPU编程和流式多处理器(六)
GPU编程和流式多处理器(六) 5. 纹理和表面 读取和写入纹理和表面的指令,所引用的隐式状态,比其他指令要多得多.header中包含诸如基地址,尺寸,格式和纹理内容的解释之类的参数,该header是 ...
- CUDA 7 流并发性优化
异构计算是指高效地使用系统中的所有处理器,包括 CPU 和 GPU .为此,应用程序必须在多个处理器上并发执行函数. CUDA 应用程序通过在 streams 中执行异步命令来管理并发性,这些命令是按 ...
- Usb-type-C端口实现的挑战与设计方案
Usb-type-C端口实现的挑战与设计方案 USB Type-C port implementation challenges and design solutions USB from 1.1 t ...
- 使用multus实现管理网和业务网分离——calico和flannel共存
多个网络层面的需求 一开始为k8s集群搭建了calico网络,所有的容器都用calico对应的网卡进行通信.为了实现网络监控的清爽,想把管理组件,例如日志.统计.监控等组件挪到另外一个网络.于是产生一 ...