91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

獨立看門狗的一點經(jīng)驗

來源:公眾號【魚鷹談單片機】

作者:魚鷹Osprey

stm32基本都內(nèi)置兩種看門狗(另外還有外置的看門狗芯片),窗口看門狗和獨立看門狗,兩種看門狗的使用方法和應(yīng)用場景各不相同,今天主要講講最常用的獨立看門狗(工作這么多年,沒見誰用過窗口看門狗,這種估計在時序嚴(yán)格的場合會用上)。

所謂獨立(Independent watchdog),就是該看門狗有獨立的時鐘源供看門狗使用,VIP專屬。這樣即使程序跑飛,或者主時鐘掛掉,照樣運行。但是精度嘛,你懂的(VIP用戶一般比較飄)。

所謂看門狗,外形雖然不像(一堆電子電路,肯定不像),但行為真的狗,還是一條瘋狗。為啥這么說呢?

這只狗一定要在規(guī)定以內(nèi)的時間(這個時間自己設(shè)置)喂食,超出一點都不行,否則就咬人(復(fù)位整個程序,讓你的人生重新來過)

但是瘋狗用的好,就是一條專業(yè)的好狗,比誰都敬業(yè)(雖然會有點飄哈,因此喂狗的時間不能卡太死,需要有充足的余量)。所以絕大部分產(chǎn)品都會用上看門狗,以防意外情況發(fā)生,可以有重頭再來的機會。

但是喂狗也有方法,不能隨便喂,不然狗的行為就不專業(yè)了(該復(fù)位的時候不復(fù)位)。所以需要專業(yè)的調(diào)教。

比如,喂狗的地方一般只有一個地方,并且是一定會執(zhí)行的。

裸機時,一般放主循環(huán)while(1)里面定時執(zhí)行(沒必要太頻繁)。

RTOS時,一般放在優(yōu)先級最低的任務(wù)中執(zhí)行,或者空閑任務(wù)中(使用鉤子函數(shù))。

千萬千萬不要在中斷處理程序中喂狗,因為可能你的主程序已經(jīng)跑死,中斷還好好的運行呢(如果要用中斷觸發(fā),可以在中斷處理程序中只設(shè)置一個變量標(biāo)志位,然后在另外位置判斷標(biāo)志位決定是否喂狗)。

但是看門狗只是一個預(yù)防措施,而不是一個正常行為,因此開發(fā)過程中,一定要關(guān)注看門狗是否出現(xiàn)復(fù)位現(xiàn)象,只要出現(xiàn)一次,都要揪出問題的根本原因,否則到了市場上一定會復(fù)位的。

引起程序復(fù)位的原因有很多種,比如上電、掉電,那么如何看是否由看門狗引起的呢?有個寄存器是可以看到具體原因的,比如stm32f1 (其他的可以自己查手冊)

代碼實現(xiàn):

hw_cpu_reset_flag_t hw_cpu_reset_get(void)
{
    hw_cpu_reset_flag_t temp = {.value = 0};// 自定義的一個結(jié)構(gòu)變量,方便使用

    if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
    {
       temp.flag.power = 1;
    }
    if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST)!= RESET)
    {
       temp.flag.low_power = 1;
    }
    if(RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
    {
       temp.flag.pin_reset = 1;
    }
    if(RCC_GetFlagStatus(RCC_FLAG_SFTRST)!= RESET)
    {
       temp.flag.software_reset = 1;
    }  
    if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
    {
       temp.flag.independent_dog = 1;
    }
    if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)!= RESET)
    {
       temp.flag.window_dog = 1;
    }
    
    RCC_ClearFlag();//清除RCC中復(fù)位標(biāo)志

    return temp;
}

另外在調(diào)試過程中,我們可以一開始就禁用看門狗(一般在調(diào)試寄存器中)比如 :

DBGMCU_Config (DBGMCU_IWDG_STOP, ENABLE);

這樣即使程序因調(diào)試而長時間暫停,也不會產(chǎn)生復(fù)位,否則看門狗復(fù)位,會影響調(diào)試。

需要注意的是,即使在在線調(diào)試環(huán)境下,一旦全速運行,如果程序喂狗不及時,仍然會引起復(fù)位(這也是我們希望的,可以在調(diào)試過程中發(fā)現(xiàn)喂狗是否有問題)代碼調(diào)著調(diào)著就失聯(lián)了

如果我們的代碼已經(jīng)下載到單片機,但又沒用設(shè)置該位,如果你采用魚鷹之前介紹的抓現(xiàn)場環(huán)境的方法(關(guān)鍵字 顛覆認(rèn)知),那么也可能會引起看門狗的復(fù)位,因此我們既可以在寄存器界面手動設(shè)置(看你手速快不快,能不能在復(fù)位前設(shè)置),也可以通過 *.ini 文件設(shè)置該寄存器完成(建議使用該方法,不用拼手速,哈哈)

*.ini 禁用看門狗:

_WWORD (0xE0042004, 0x100); // 注意該代碼會將其它位清零。可以采用下面這種方式
//
DEFINE int temp;
temp = _RWORD (0xE0042004); // CSR address
temp |= 0x100;
_WWORD (0xE0042004, temp); 

如果上面方法有疑惑,查查魚鷹分享的歷史筆記吧,一定會有所收獲的。

聲明:本內(nèi)容為作者獨立觀點,不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯的朋友,別忘了一鍵三連哦!
贊 1
收藏 4
關(guān)注 160
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 泰兴市| 陕西省| 略阳县| 安平县| 长兴县| 宜君县| 合水县| 英山县| 兴山县| 罗田县| 思茅市| 云林县| 肥乡县| 民和| 巴里| 中山市| 库尔勒市| 商南县| 喀什市| 新乡市| 泸溪县| 丰镇市| 芮城县| 德钦县| 肇州县| 商河县| 紫金县| 曲靖市| 额尔古纳市| 吉木萨尔县| 卢氏县| 阳高县| 和田县| 桑日县| 北流市| 长阳| 和顺县| 信丰县| 通河县| 东辽县| 札达县|