1 RT-Thread 的WDT簡(jiǎn)介
WDT(Watch Dot timer)即看門(mén)狗定時(shí)器,其主要作用是當(dāng)發(fā)生軟件故障時(shí)可以產(chǎn)生復(fù)位信號(hào),使程序復(fù)位,其本質(zhì)是一個(gè)計(jì)數(shù)器。
當(dāng)看門(mén)狗啟動(dòng)后,計(jì)數(shù)器開(kāi)始自動(dòng)計(jì)數(shù),在計(jì)數(shù)器溢出前如果沒(méi)有被復(fù)位,計(jì)數(shù)器溢出就會(huì)對(duì) CPU 產(chǎn)生一個(gè)復(fù)位信號(hào)使系統(tǒng)重啟(俗稱 “被狗咬”)。系統(tǒng)正常運(yùn)行時(shí),需要在看門(mén)狗允許的時(shí)間間隔內(nèi)對(duì)看門(mén)狗計(jì)數(shù)器清零(俗稱“喂狗“),不讓復(fù)位信號(hào)產(chǎn)生。如果系統(tǒng)不出問(wèn)題,程序能夠按時(shí)“喂狗”。一旦程序跑飛,沒(méi)有“喂狗”,系統(tǒng)“被咬” 復(fù)位。
WDT相關(guān)接口如下所示:
| 函數(shù) | 描述 |
|---|---|
| rt_device_find() | 根據(jù)看門(mén)狗設(shè)備設(shè)備名稱查找設(shè)備獲取設(shè)備句柄 |
| rt_device_init() | 初始化看門(mén)狗設(shè)備 |
| rt_device_control() | 控制看門(mén)狗設(shè)備 |
| rt_device_close() | 關(guān)閉看門(mén)狗設(shè)備 |
關(guān)于WDT更詳細(xì)的內(nèi)容,請(qǐng)參看官方手冊(cè):
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/watchdog/watchdog
2 WDT使用實(shí)例
WDT使用起來(lái)很簡(jiǎn)單。
1、根據(jù)設(shè)備名稱 “wdt” 查找設(shè)備獲取設(shè)備句柄。
2、初始化設(shè)備后設(shè)置看門(mén)狗溢出時(shí)間。
3、啟動(dòng)看門(mén)狗。
4、喂狗:設(shè)置空閑線程回調(diào)函數(shù),在空閑線程回調(diào)函數(shù)中喂狗。
2.1 RA6E2 WDT配置
接下來(lái)配置WDT,只需要簡(jiǎn)單配置就可使用。
- FSP配置WDT
打開(kāi)RA Smart Configurator,添加WDT的stack。

[]()[]()[]()Figure 2?1 添加WDT的stack步驟
接下來(lái)需要配置WDT的參數(shù)。

[]()[]()[]()Figure 2?2 WDT參數(shù)設(shè)置
這里可以設(shè)置WDT的參數(shù)。
- 使能WDT

2.2 代碼實(shí)現(xiàn)
核心代碼如下:
#include < rtthread.h >
#include < rtdevice.h >
#define WDT_DEVICE_NAME "wdt" /* 看門(mén)狗設(shè)備名稱 */
static rt_device_t wdg_dev; /* 看門(mén)狗設(shè)備句柄 */
static void idle_hook(void)
{
/* 在空閑線程的回調(diào)函數(shù)里喂狗 */
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
rt_kprintf("feed the dog!n ");
rt_thread_mdelay(300);
}
int wdt_sample(int argc, char *argv[])
{
rt_err_t ret = RT_EOK;
char device_name[RT_NAME_MAX];
rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);
/* 根據(jù)設(shè)備名稱查找看門(mén)狗設(shè)備,獲取設(shè)備句柄 */
wdg_dev = rt_device_find(device_name);
if (!wdg_dev)
{
rt_kprintf("find %s failed!n", device_name);
return RT_ERROR;
}
/* 啟動(dòng)看門(mén)狗 */
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
if (ret != RT_EOK)
{
rt_kprintf("start %s failed!n", device_name);
return -RT_ERROR;
}
/* 設(shè)置空閑線程回調(diào)函數(shù) */
rt_thread_idle_sethook(idle_hook);
return ret;
}
/* 導(dǎo)出到 msh 命令列表中 */
MSH_CMD_EXPORT(wdt_sample, wdt sample);
2.3 測(cè)試
編譯下載。
如果屏蔽喂狗操作,在終端輸入“wdt_sample”即可進(jìn)行測(cè)試。

執(zhí)行wdt_sample,結(jié)果如下:(一秒后觸發(fā)WDT復(fù)位)

如果定時(shí)喂狗,在終端輸入“wdt_sample”即可進(jìn)行測(cè)試。
-
看門(mén)狗
+關(guān)注
關(guān)注
10文章
610瀏覽量
72976 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3368瀏覽量
123711 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1614瀏覽量
44906
發(fā)布評(píng)論請(qǐng)先 登錄
【EK-RA6E2開(kāi)發(fā)指南】WDT實(shí)踐
評(píng)論