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

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

FreeRTOS实验_独立看门狗监视多线程_第1张图片


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

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

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

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

       


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

        FreeRTOS实验_独立看门狗监视多线程_第2张图片


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

        FreeRTOS实验_独立看门狗监视多线程_第3张图片

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

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

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

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

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

       


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

        FreeRTOS实验_独立看门狗监视多线程_第4张图片


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

       


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

        FreeRTOS实验_独立看门狗监视多线程_第5张图片


       FreeRTOS实验_独立看门狗监视多线程_第6张图片

        FreeRTOS实验_独立看门狗监视多线程_第7张图片

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


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

你可能感兴趣的:(FreeRTOS系列)