FreeRTOS系统下看门狗定时器的使用总结

news2024/11/19 7:50:22

文章目录

    • 前言
    • 定时器分类
      • 何为看门狗定时器
    • 系统复位
    • 系统级看门狗SWDT的使用
      • 1.看门狗配置
      • 2、独立监测多任务方式

前言

本文记录自己使用看门狗定时器的过程,起因是系统不知名原因总是跑挂,查了很久找不到原因(排除了变量溢出、中断冲突等,各位大佬要是有相关经验可以文末留言或者私信,感谢!),因此选择了使用看门狗定时器做全局复位的补救措施,希望能给诸位学习者做一个参考。

硬件平台:ZYNQ7000系列
软件系统:FreeRTOS
本文参考博文:
FreeRTOS系统-独立看门狗监测任务执行状态
看门狗的配置参考博文
FreeRTOS系统-独立看门狗监测任务执行状态
参考技术手册:ug585-Zynq-7000

定时器分类

如图所示,每个 Cortex-A9 处理器都有自己的专用 32 位定时器和 32 位看门狗定时器。两个处理器共享一个全局 64 位定时器。这些定时器始终以 CPU 频率的 1/2 计时(CPU_3x2x)。

在系统级,有一个 24 位看门狗定时器和两个16 位三重定时器/计数器。系统看门狗定时器的时钟频率为 CPU 频率 (CPU_1x) 的 1/4 或 1/6,或者可以通过来自 MIO 引脚或 PL 的外部信号。两个三重定时器/计数器始终计时在 CPU 频率 (CPU_1x) 的 1/4 或 1/6 处,用于计算来自 MIO 引脚或 PL 的信号脉冲宽度。

本文使用的是SWDT也就是系统的全局看门狗定时器。

何为看门狗定时器

本质上是一个定时器,当看门狗超时向芯片发送复位信号,正常运行时要避免看门狗超时,可以通过周期性地重置看门狗定时器的计数器来防止看门狗超时,这种操作叫做喂狗。如果程序跑飞或者进入死循环,不执行喂狗的代码,看门狗定时器就会超时,导致系统复位。

系统复位

在这里插入图片描述
看门狗定时器复位由看门狗定时器在启用且定时器到期时在内部生成。PS 中有三个不同的看门狗定时器:两个 ARM 内核(AWDT0 和 AWDT1)中各有一个系统级计时器 (SWDT) 和一个专用计时器。系统级定时器复位信号始终复位整个系统,而专用看门狗定时器可以仅复位容纳它的 ARM 内核,也可以复位整个系统。

系统级看门狗SWDT的使用

看门狗的配置参考博文

1.看门狗配置

//看门狗定时器
XScuWdt Watchdog;
#define WDT_DEVICE_ID    XPAR_SCUWDT_0_DEVICE_ID
int watchdogConfig(XScuWdt * WdtInstancePtr, u16 DeviceId,float number)
{
	int Status;
	XScuWdt_Config *ConfigPtr;
	u32 result;
	//用来配置WDT的设备ID号,ID号在#include "xparameters.h"中可以找到。
	xil_printf("start the watchdog timer successful! \r\n");
	ConfigPtr = XScuWdt_LookupConfig(DeviceId);
	//初始化WDT计数器
	Status = XScuWdt_CfgInitialize(WdtInstancePtr, ConfigPtr,
		  ConfigPtr->BaseAddr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	//通过设置看门狗控制寄存器的WD模式位,将看门狗定时器置于看门狗模式
	XScuWdt_SetWdMode(WdtInstancePtr);
	//给WDT计数器装初值,这里我对此函数进行了封装。已知CPU的时钟频率为800Mhz,
	//即WDT的时钟频率为400Mhz,可得倒计时1s计数器需要配置的初值为400_000_000,
	//对计数器赋的初值可以直接写在number变量中(本文赋值为10s)。
	result = (unsigned long)(400000000*number);
	XScuWdt_LoadWdt(WdtInstancePtr,result);
	//开启看门狗计数器。
	XScuWdt_Start(WdtInstancePtr);
	return XST_SUCCESS;
}

2、独立监测多任务方式

在多任务系统中,用看门狗的时候,我们希望可以实现看门狗监测整个系统每个任务的健康存活情况。假如系统中某个任务死掉了,能够通过看门狗进行系统复位,从而重新复位系统,以使系统重新开始运行。而每个任务都正常的时候,不要进行看门狗复位,从而不影响系统的正常执行。具体狗的复位可以根据自己实际需求设定。

参考: freeRTOS中使用看门狗的思考与实践
(1)可以在代码的执行流中插入“喂狗”。只要在各个任务中调用“喂狗”操作即可。但是这种方式不能实现监控每个任务的存活情况。因为当使用这种方式的时候,有多处地方可以进行喂狗操作,这个时候假如某个任务已经死掉了,它自身因为已经死掉不能在进行喂狗,但是其他的任务可以喂狗,整个系统依然不回被复位,也就不能知道某个任务是否出现问题。

(2)单独创建一个喂狗任务,监视各个任务的存活状态进行喂狗。

这种方式相比较于到处去调用喂狗操作更加实用,它是要在确认每个任务都正常存活的情况下才喂狗。如果某个任务因为故障不再运行了,就会导致超时不能喂狗,从而会导致系统被看门狗复位。
在这里插入图片描述
图片来源:FREERTOS — 独立看门狗检测任务执行状态

这种方式的实现有很多种手段,比如用事件标志组的方式就比较容易实现。

做法是:
参考文章:FreeRTOS系统-独立看门狗监测任务执行状态

需要用到的头文件

#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"

1)创建一个“喂狗”的独立任务;

/*
 * 喂狗任务
 * 在任务均已执行的情况下进行喂狗
 */
void Iwdg_task(void *pvParameters)
{
	 EventBits_t uxBits;
	 const TickType_t xTicksToWait = 2000 / portTICK_PERIOD_MS; /* 最大延迟2000ms */

	Status = watchdogConfig(&Watchdog, WDT_DEVICE_ID,10);
	while(1)
	{
		/* 等待所有任务发来事件标志 */
		uxBits = xEventGroupWaitBits(xCreatedEventGroup, /* 事件标志组句柄 */
									 TASK_BIT_ALL,       /* 等待TASK_BIT_ALL被设置 */
									 pdTRUE,             /* 退出前TASK_BIT_ALL被清除,这里是TASK_BIT_ALL都被设置才表示“退出”*/
									 pdTRUE,             /* 设置为pdTRUE表示等待TASK_BIT_ALL都被设置*/
									 xTicksToWait);      /* 等待延迟时间 */
		if((uxBits & TASK_BIT_ALL) == TASK_BIT_ALL)//判断各个任务是否执行
		{
			IWDG_Feed();
		}
	}
}

2)申请一个事件标志组,并为每个任务留一个标志位;

#define TASK_BIT_1    (0x01 << 0)
#define TASK_BIT_2    (0x01 << 1)
#define TASK_BIT_3    (0x01 << 2)
#define TASK_BIT_4    (0x01 << 3)
#define TASK_BIT_5    (0x01 << 4)
#define TASK_BIT_6    (0x01 << 5)
#define TASK_BIT_ALL	( TASK_BIT_1 |TASK_BIT_2 | TASK_BIT_3|TASK_BIT_4)

EventGroupHandle_t xCreatedEventGroup;//声明事件组 
xCreatedEventGroup = xEventGroupCreate();	//创建事件组

3)在每个单独的任务中执行的时候置位属于这个任务的标志位;

void task(void *pvParameters)
{
	while(1)
	{
		...
		xEventGroupSetBits(xCreatedEventGroup, TASK_BIT_1);//标志位置一
		vTaskDelay(500);
	}
}

4)在“喂狗”的独立任务中检测这些所有的任务所关联的标志位,
如果所有的标志位都置位成立,说明所有的任务都正常,进行一次喂狗操作。反之则引发一次复位。

		/* 等待所有任务发来事件标志 */
		uxBits = xEventGroupWaitBits(xCreatedEventGroup, /* 事件标志组句柄 */
									 TASK_BIT_ALL,       /* 等待TASK_BIT_ALL被设置 */
									 pdTRUE,             /* 退出前TASK_BIT_ALL被清除,这里是TASK_BIT_ALL都被设置才表示“退出”*/
									 pdTRUE,             /* 设置为pdTRUE表示等待TASK_BIT_ALL都被设置*/
									 xTicksToWait);      /* 等待延迟时间 */
		if((uxBits & TASK_BIT_ALL) == TASK_BIT_ALL)//判断各个任务是否执行
		{
			IWDG_Feed();
		}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1150092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决找不到vcruntime140.dll无法执行代码的方法分享

在我们用电脑的过程中&#xff0c;总免不了碰到些问题&#xff0c;比如“找不到vcruntime140.dll”。这通常是我们在运行某些软件的时候&#xff0c;电脑找不到它需要的一个叫动态链接库的文件。这个问题有很多原因&#xff0c;比如软件安装的时候出了问题&#xff0c;系统文件…

2023上海初中生古诗文大会初选将于11月5日开始,划重点来了

好消息&#xff01; 根据主办方通知&#xff0c;2023年上海市中学生古诗文大会&#xff08;初中组&#xff09;&#xff0c;以下简称初中生古诗文大会&#xff0c;初选将于11月5日开始。 有许多家长和初中同学关心&#xff0c;初中生古诗文大会如何参加&#xff1f;考多长时间…

Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库

Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库 Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库安装 IndexDB类库引入 localForage测试 新增数据、获取数据 Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库 大部分场景使用 LocalStore都…

Windows域控制器的部署以及加入

域控制器&#xff1a;Windows Server 2022 域内主机&#xff1a;Windows7、Windows Server 2008 R2 安装部署预控 服务器管理器-添加角色和功能&#xff0c;一路下一步&#xff0c;到“服务器角色”&#xff0c;勾选“Active Directory 域服务”&#xff0c;一路下一步直到安…

审核 Microsoft SQL Server 日志

手动审核数据库活动是一项艰巨的任务&#xff0c;有效完成审计的最佳方法是使用简化和自动化数据库监控的综合解决方案&#xff0c;该解决方案还应使数据库管理员能够监控、跟踪和即时识别任何操作问题的根本原因&#xff0c;并实时检测对机密数据的未经授权的访问。 什么是 S…

基于SpringBoot+Vue实现前后端分离的房屋租赁系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

ARL灯塔安装与使用

ARL灯塔安装与使用 1. 系统要求2. ARL灯塔安装2.1. docker环境安装2.1.1. 更新yum包2.1.2. 卸载老版docker2.1.3. 安装docker所需要的依赖包2.1.4. 设置yum源2.1.5. 查看仓库中docker版本2.1.6. 安装docker最新版2.1.7. docker设置2.1.8. docker其它命令 2.2. 安装docker-compo…

世微 60V高端电流采样降压恒流驱动IC LED电源驱动器AP51656

1产品描述 AP51656是一款连续电感电流导通模式的降压恒流源&#xff0c;用于驱动一颗或多颗串联LED输入电压范围从 5 V 到 60V&#xff0c;输出电流 最大可达 1.5A 。根据不同的输入电压和 外部器件&#xff0c; 可以驱动高达数十瓦的 LED。 内置功率开关&#xff0c;采用高端…

ModelMapper

ModelMapper用于将视图对象和实体类进行转换。 依赖&#xff1a; 单例模式&#xff1a; API控制器&#xff1a; 使用&#xff1a;

Mac电脑矢量编辑必备:Sketch 最新中文 for mac

Sketch是一款专门为Mac设计的矢量图形绘制软件&#xff0c;广泛应用于UI/UX设计领域。它拥有丰富的设计工具和功能&#xff0c;使得设计师可以轻松创建高质量的界面设计和交互原型。Sketch基于矢量图形&#xff0c;可以无损放大和缩小&#xff0c;保证设计的清晰度和质量。它还…

Linux的简介和环境搭建

简介 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想&#xff0c;是一个…

【前端早早聊直播回顾】Harmony Next 与 Flutter 的不解之缘

Hello 大家好&#xff0c;我是 Flutter GDE 郭树煜&#xff0c;本次要分享的话题是关于鸿蒙与 Flutter 的故事&#xff0c;可能没接触过的会感觉有点懵&#xff0c;Harmony 和 Flutter 有啥关系&#xff0c;它们怎么会被放到一起讲了呢&#xff1f;接下来就让我们来聊聊这个问题…

AMEYA360:类比半导体重磅发布车规级智能高边驱动HD7xxxQ系列

致力于提供高品质芯片的国内优秀模拟及数模混合芯片设计商上海类比半导体技术有限公司(下称“类比半导体”或“类比”)宣布推出重磅新品车规级智能高边驱动HD7xxxQ系列。该系列产品包括车规级单通道高边驱动HD70xxQ和车规级双通道智能高边驱动HD70xx2Q&#xff0c;提供不同通道…

HTML基本概念:

HTML简介&#xff1a; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 1&#xff09;、HTML 是用来描述网页的一种语言。 2&#xff09;、HTML 不是一种编程语言&am…

损失函数总结(十):TripletMarginLoss、TripletMarginWithDistanceLoss

损失函数总结&#xff08;十&#xff09;&#xff1a;TripletMarginLoss、TripletMarginWithDistanceLoss 1 引言2 损失函数2.1 TripletMarginLoss2.2 TripletMarginWithDistanceLoss 3 总结 1 引言 在前面的文章中已经介绍了介绍了一系列损失函数 (L1Loss、MSELoss、BCELoss、…

腾讯云轻量应用服务器“镜像”选择和“镜像类型”说明

腾讯云轻量应用服务器镜像是什么&#xff1f;镜像就是操作系统&#xff0c;轻量服务器镜像系统怎么选择&#xff1f;如果是用来搭建网站腾讯云百科txybk.com建议选择选择宝塔Linux面板腾讯云专享版&#xff0c;镜像系统根据实际使用来选择&#xff0c;腾讯云百科来详细说下腾讯…

HTML标签、CSS介绍

标签的分类: 块级/行内 # 块级标签: 独占一行 h1~h6 p div """ 块儿级标签可以修改长宽. 行内标签不可以, 就算修改了也不会变化.块级标签内部可以嵌套任意的块级标签和行内标签. 特例: 是p标签虽然是块级标签 但是它只能嵌套行内标签 不能嵌套块级标签. 如…

1月18-19日|2024中国亚洲鞋业国际峰会

2024中国&亚洲鞋业国际峰会 2024年1月18-19&#xff0c;上海 主办方&#xff1a;ECV International 峰会背景 在全球时尚产业减排的关键期&#xff0c;作为仅次于石化工业的第二大污染产业&#xff0c;时尚行业的绿色生产迫在眉睫。一直以来&#xff0c;制鞋行业都是环境…

优思学院|精益管理是如何帮助提高企业生产率的?

精益管理是一种生产管理理念&#xff0c;其目标是最大化价值&#xff0c;同时最小化浪费&#xff0c;通过消除浪费并提高效率来缩短交付周期、提高产品质量和降低成本。这种方法通常通过持续改进、标准化工作流程和消除缺陷来实现。 精益制造管理的理念如同一盏明灯&#xff0…

在Win10系统进行MySQL的安装、连接、卸载

在Win10系统进行MySQL的安装、连接、卸载 MySQL的安装 本教程在Win10系统下安装部署MySQL-8.0.32版。 MySQL安装参考地址 MySQL安装包地址 提取码: rnbc。 选择下载mysql-installer-community-8.0.32.0安装包。 连接数据库 方式一: 安装后,可以在开始菜单的列表中找到MySQ…