RISCV_Watchdog使用参考
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 04/21/2023 |
1. 概述¶
硬件 watchdog 提供超时复位系统的功能,其功能由定时器和复位功能组成,用户可以设定一个超时时间,并在超时时间以内对它进行“喂狗”的操作,重置其内部计数,如果其内部计算达到了设定的超时时间,watchdog 就会对系统进行复位,重启系统。
2. 关键字说明¶
-
watchdog
看门狗,是一个定时器电路,一般有一个输入,叫喂狗(kicking the dog/service the dog),一个输出到MCU的RST端,MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给 WDT清零,如果超过规定的时间不喂狗(一般在程序跑飞时),WDT定时超过,就会给出一个复位信号到MCU,使MCU复位。防止MCU死机. 看门狗的作用就是防止程序发生死循环,或者说程序跑飞。
-
watchdog timeout
看门狗的超时时长,如果超过这个时长不喂狗,WDT定时超过,就会给出一个复位信号到MCU,使MCU复位。
-
watchdog pretimeout
看门狗的预超时时长。pretimeout是触发时间到系统重启时间点的长度。比如,如果你设置timeout为60, pretimeout为50,那么在50秒的时候(重启之前的 10秒)将触发机关。
3. 功能描述¶
linux 内核支持基于 hrtimer 的 softdog 和基于硬件的硬件看门狗,创建 /dev/watchdog* 设备文件与用户空间程序进行交互。用户空间的 watchdog 程序,会通过/dev/watchdog* 设备进行周期性喂狗。
4. 硬件连接介绍¶
NA
5. RTOS用法介绍¶
5.1. DRIVER PATH¶
sc/driver/sysdriver/watchdog/drv/mdrv_wdt_api.h
sc/driver/sysdriver/watchdog/drv/mdrv_wdt.c
sc/driver/sysdriver/watchdog/drv/mdrv_wdt_reg.h
sc/driver/sysdriver/watchdog/drv/mdrv_wdt_test.c
5.2. CONFIG配置¶
config文件位于mak/options_pcupid_riscv_isw.mak
,使能CONFIG_WATCHDOG_SUPPORT
# Feature_Name = [DRV] WATCHDOG driver support # Description = WATCHDOG driver support # Option_Selection = TRUE, FALSE CONFIG_WATCHDOG_SUPPORT = TRUE
5.3. SYSDESC配置¶
无需配置。
5.4. Padmux配置¶
无需配置。
5.5. Sample code¶
int watchdog_test(void) { int wdt_timeout = 10; /* 10s */ int i = 0; if(sstar_wdt_probe()!=0) { CamOsPrintf("sstar_wdt_probe failed to execute\n"); return -1; } if (sstar_wdt_set_timeout(wdt_timeout)!=0) /*设置watchdog超时时间*/ { CamOsPrintf("sstar_wdt_set_timeout failed to execute\n", argc); return -1; } if(sstar_wdt_start()!=0) /*启动watchdog*/ { CamOsPrintf("sstar_wdt_start failed to execute\n"); return -1; } for(i = 0; i < 10; i++){ CamOsMsSleep(wdt_timeout*1000/2); /*每隔5s喂一次狗,喂10次 */ if (sstar_wdt_ping()!=0) { return -1; } } /* 50s后系统不再喂狗,第60s的时候watchdog将触发系统将被重启*/ return 0; }
5.6. UT case¶
测试用例:
1)打开Watchdog的宏CONFIG_WATCHDOG_SUPPORT和__VER_WATCHDOG__
2)测试demo路径:sc/driver/sysdriver/watchdog/drv/mdrv_wdt_test.c
3)执行测试
SS-RTOS # wdttest argv must like start/reset xs,num must be 2, now is: 0 [start/reset] [time (s)] - Do some tests about wdt' Example: # wdttest start 10 /* 启动watchdog后,系统会不断去喂狗,所以10秒后系统不会重启 */ # wdttest reset 10 /* 启动watchdog后,系统不会去喂狗,所以10秒后系统将重启 */
6. API参考¶
该功能模块提供以下接口:
API名称 | 功能 |
---|---|
sstar_wdt_probe | 初始化watchdog |
sstar_wdt_remove | 释放watchdog |
sstar_wdt_start | 启动watchdog |
sstar_wdt_stop | 关闭watchdog |
sstar_wdt_set_timeout | 设置watchdog超时时间 |
sstar_wdt_ping | 喂狗操作 |
6.1. sstar_wdt_probe¶
-
功能
初始化watchdog
-
语法
int sstar_wdt_probe(void);
-
参数
参数名称 描述 NA NA -
返回值
返回值 描述 0 成功 other 失败
6.2. sstar_wdt_remove¶
-
功能
释放watchdog,如果watchdog正在运行,则先停止watchdog
-
语法
int sstar_wdt_remove(void);
-
参数
参数名称 描述 NA NA -
返回值
返回值 描述 0 成功 other 失败
6.3. sstar_wdt_start¶
-
功能
按设定好的或者默认的timeout启动WDT
-
语法
int sstar_wdt_start(void);
-
参数
参数名称 描述 NA NA -
返回值
返回值 描述 0 成功 other 失败
6.4. sstar_wdt_stop¶
-
功能
停止watchdog
-
语法
int sstar_wdt_stop(void);
-
参数
参数名称 描述 void NA -
返回值
返回值 描述 0 成功 other 失败
6.5. sstar_wdt_set_timeout¶
-
功能
设定WDT超期的时长,如果没有在这个时长内没有周期地使用sstar_wdt_ping来‘喂狗’,系统将会复位,俗称‘狗咬’
-
语法
int sstar_wdt_set_timeout(unsigned int timeout)
-
参数
参数名称 描述 timeout watchdog超时时间 -
返回值
返回值 描述 0 成功 other 失败
6.6. sstar_wdt_ping¶
-
功能
复位WDT计数器,俗称‘喂狗’
-
语法
int sstar_wdt_ping(void)
-
参数
参数名称 描述 void NA -
返回值
返回值 描述 0 成功 other 失败
7. FAQ¶
NA