• 資料介紹
    • 前言
    • 1、概括
    • 2、工作原理
    • 3、注意問(wèn)題
    • 4、總結(jié)
  • 資料預(yù)覽
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

LAT6027 MPU的Watchdog在Linux系統(tǒng)下的使用和注意事項(xiàng)

03/11 16:54
806
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

LAT6027 MPU的Watchdog在Linux系統(tǒng)下的使用和注意事項(xiàng)

334.75 KB

前言

我們知道 Watchdog 對(duì)故障檢測(cè)和系統(tǒng)恢復(fù)都至關(guān)重要,但是如果對(duì) MPU 的 Watchdog 在Linux 系統(tǒng)下是如何工作的不是很了解,就不會(huì)讓 Watchdog 發(fā)揮它該有的作用,所以接下來(lái)大概講解一下如何測(cè)試和使用 linux 系統(tǒng)下的 Watchdog。

1、概括

MP13x/MP15x有兩路獨(dú)立的看門(mén)狗(IWDG1, IWDG2),其中只有IWDG1才可以被配置到安全區(qū)域下訪問(wèn)。獨(dú)立看門(mén)狗是由LSI提供時(shí)鐘,外部獨(dú)立的32kHz的RC提供時(shí)鐘源,所以能保證看門(mén)狗在整個(gè)MPU系統(tǒng)中獨(dú)立安全可靠的運(yùn)行。另外MP15x還有一個(gè)窗口看門(mén)狗(WWDG),可以作為Cortex-M4協(xié)處理器的Watchdog,Watchdog還可以作為定時(shí)器低功耗喚醒源,但是這篇LAT不會(huì)討論相關(guān)話題。

2、工作原理

對(duì) Watchdog 的寄存器配置和中斷響應(yīng)依賴的是 APB 時(shí)鐘,所以在配置 Watchdog 之前,需要先對(duì) APB 時(shí)鐘進(jìn)行使能(IWDG1 總線時(shí)鐘是通過(guò) IWDG1APBEN 和 IWDG1APBLPEN 位來(lái)控制,同理 IWDG2 總線時(shí)鐘是通過(guò) IWDG2APBEN 和 IWDG2APBLPEN 位來(lái)使能),另外Watchdog 的運(yùn)行時(shí)鐘是由 LSI RC 提供。

默認(rèn)的 Watchdog 工作方式是,一旦 Watchdog 使能,IWDCNT 就開(kāi)始向下計(jì)數(shù),當(dāng)這個(gè)值從默認(rèn)的 0xFFF 變?yōu)?0x000 時(shí)就會(huì)產(chǎn)生 iwdg_out_rst 信號(hào),可以使系統(tǒng)重啟。所以在IWDCNT 在變?yōu)?1 之前就需要刷新 Watchdog 防止系統(tǒng) reset,這里通過(guò)把 0x0000AAAA 寫(xiě)入IWDG_KR 寄存器來(lái)刷新 IWDCNT 恢復(fù)默認(rèn)值 0xFFF。由于 Linux 系統(tǒng)很難做到和裸跑程序一樣的實(shí)時(shí)性,所以喂狗時(shí)間盡可能的提前,不宜無(wú)限接近 Watchdog 的 timeout 時(shí)間。

關(guān)于喂狗時(shí)間,由上面的簡(jiǎn)單描述可以知道,IWDCNT 的默認(rèn)值 0xFFF 是 Watchdog 的最大超時(shí)喂狗時(shí)間(窗口看門(mén)狗是另外的設(shè)計(jì)),所以可以通過(guò) IWDG_PR 寄存器來(lái)配置 LSI 運(yùn)行時(shí)鐘的 Prescaler divider,從而配置需要的最大超時(shí)時(shí)間。例如,默認(rèn)的 Watchdog 工作時(shí)鐘源是 32Khz LSI RC,如果把 IWDG_PR 寄存器配置為 0x6(divider / 256),那么 Watchdog 工作時(shí)鐘就變?yōu)?125Hz,IWDCNT 從 0xFFF 變?yōu)?0x000 就需要(1/125)*4095 約等于 32 秒鐘。

3、注意問(wèn)題

1) 一旦 watchdog 使能了,整個(gè)系統(tǒng)從 tf-a 到 Linux kernel 各個(gè) 啟動(dòng)階段都需要不斷的喂狗,所以當(dāng)任何一個(gè)啟動(dòng)階段卡頓時(shí)間超過(guò)喂狗的周期,就會(huì)觸發(fā) watchdog 重啟。需要注意的是,盡量不要停掉 kernel 內(nèi)部的定時(shí)器喂狗程序。同時(shí)需要注意,當(dāng)應(yīng)用程序通過(guò)/dev/watchdog 設(shè)備節(jié)點(diǎn),打開(kāi)看門(mén)狗后,Linux kernel 就停掉定時(shí)器喂狗,把喂狗執(zhí)行交給應(yīng)用程序,所以這個(gè)時(shí)候外部的喂狗程序不能中斷。

2) 前面一直提到 TF-A 打印可以查看到重啟的原因,重啟原因是通過(guò) RCC_MP_RSTSCLRR寄存器來(lái)判斷的,如果打印的原因一直是 power-on reset,并沒(méi)有看到 watchdog 觸發(fā)的原因。主要因?yàn)樵?watchdog 重啟系統(tǒng)的時(shí)候,可能是外部的 VDD 供電被重啟過(guò),導(dǎo)致 MPU 的狀態(tài)恢復(fù)到冷啟動(dòng)狀態(tài)。所以這邊硬件要注意 MPU 重啟的時(shí)候,盡量不要重啟 VDD 供電。

4、總結(jié)

從 OSTL4.0 開(kāi)始,Linux kernel 階段和 U-Boot 階段都是通過(guò) smc 服務(wù)接口調(diào)用 optee 安全區(qū)域的 Watchdog 來(lái)配置和喂狗的,Linux 可以參考 drivers/watchdog/arm_smc_wdt.c 源碼。舊版本的 Watchdog 使用的是 IWDG2,U-Boot 驅(qū)動(dòng)(drivers/watchdog/stm32mp_wdt.c)和 Linux 驅(qū)動(dòng)(drivers/watchdog/stm32_iwdg.c)直接調(diào)用 Watchdog 的寄存器(KR,PR,RLR 等)來(lái)實(shí)現(xiàn)。另外需要注意,默認(rèn)的 systemd是配置看門(mén)狗的,如果發(fā)現(xiàn)/dev/watchdog 設(shè)備節(jié)點(diǎn)不讓訪問(wèn),需要根據(jù)上文提到的方法來(lái)關(guān)閉 systemd 的喂狗程序。一旦應(yīng)用程序接管了喂狗程序,喂狗不能中斷。

資料預(yù)覽

相關(guān)推薦