1. 程式人生 > >FreeRTOS實驗_獨立看門狗監視多執行緒

FreeRTOS實驗_獨立看門狗監視多執行緒

1.首先隨意建立幾個執行緒,如下圖:

2.然後就要思考了,怎麼樣實現如果其中一個執行緒死掉了,就不喂狗得以讓系統重啟?

        其實,我們可以反過來想一下,什麼情況下才喂狗得以讓系統正常執行?答案是,所有執行緒都活著的時候。

        那麼我們就讓所有執行緒每隔一段時間上報一次“我還活著”事件給監視程式,當監視程式發現其中一個執行緒在這段時間內沒有上報“我還活著”事件時就停止喂狗。

       我們用事件組來達到,這一目的,如下圖:

       

3.接下來,我們為每個執行緒都可以定義一個事件標誌,如下圖:

       

4.我們現在可以封裝一個函式,當某個執行緒呼叫這個函式的時候,該執行緒就上報“我還活著”事件給監視程式,如下圖:

       

5.萬事俱備,我們現在只欠有一個監視程式了,如果收到所有執行緒上報“我還活著”事件,就喂狗。

        我們此時思考一下,這個監視程式肯定不能使獨立的執行緒,因為這涉及到該執行緒也可能死掉的情況。

        思前想後,得到有種方案,定時器或者軟體定時器。

        我個人比較偏向於使用軟體定時器。因為使用軟體定時器可以不佔用硬體資源;況且也不是要時間很精確地喂狗,只要在復位之前能喂一下狗就夠了。

        建立軟體定時器,如下圖:

       

6.監視的主體有了,接下來我們可以寫一下監視過程了,一旦所有執行緒都發送“我還活著”事件,就立即喂狗,如下圖:

       

7.好了,可以開啟,定時器和獨立看門狗了,如下圖:

       

8.嗯,既然每秒監視一次執行緒嘛,那麼當然所有執行緒都要保證在一秒之內上報自己還活著啦!如下圖:

       

      

       

        總是,不要讓執行緒輪轉一次超過看門狗復位時間。。。當然你也可以到處去呼叫thread_iwdg_refresh()去喂狗,我是不喜歡這麼做的。

OK,這樣多執行緒獨立看門狗的運用方法就寫完了。