FreeRTOS实验_独立看门狗监视多线程

本文介绍了一种多线程环境下确保系统稳定的看门狗机制。通过让每个线程定期向监视程序报告状态,一旦某个线程未能及时报告,则停止喂狗触发系统重启。采用事件组和软件定时器实现这一机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/baidu_23187363/article/details/53891034


1.首先随意创建几个线程,如下图:


2.然后就要思考了,怎么样实现如果其中一个线程死掉了,就不喂狗得以让系统重启?

        其实,我们可以反过来想一下,什么情况下才喂狗得以让系统正常运行?答案是,所有线程都活着的时候。

        那么我们就让所有线程每隔一段时间上报一次“我还活着”事件给监视程序,当监视程序发现其中一个线程在这段时间内没有上报“我还活着”事件时就停止喂狗。

       我们用事件组来达到,这一目的,如下图:

        


3.接下来,我们为每个线程都可以定义一个事件标志,如下图:

        


4.我们现在可以封装一个函数,当某个线程调用这个函数的时候,该线程就上报“我还活着”事件给监视程序,如下图:

        

5.万事俱备,我们现在只欠有一个监视程序了,如果收到所有线程上报“我还活着”事件,就喂狗。

        我们此时思考一下,这个监视程序肯定不能使独立的线程,因为这涉及到该线程也可能死掉的情况。

        思前想后,得到有种方案,定时器或者软件定时器。

        我个人比较偏向于使用软件定时器。因为使用软件定时器可以不占用硬件资源;况且也不是要时间很精确地喂狗,只要在复位之前能喂一下狗就够了。

        创建软件定时器,如下图:

        


6.监视的主体有了,接下来我们可以写一下监视过程了,一旦所有线程都发送“我还活着”事件,就立即喂狗,如下图:

        


7.好了,可以开启,定时器和独立看门狗了,如下图:

       


8.嗯,既然每秒监视一次线程嘛,那么当然所有线程都要保证在一秒之内上报自己还活着啦!如下图:

        


       

        

        总是,不要让线程轮转一次超过看门狗复位时间。。。当然你也可以到处去调用thread_iwdg_refresh()去喂狗,我是不喜欢这么做的。


OK,这样多线程独立看门狗的运用方法就写完了。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值