12. Watchdog 使用¶
12.1. 简介¶
看门狗(watchdog)实际是一个定时器,启动之后会开始计时,系统或者软件需要在规定时间内与看门狗通信(俗称喂狗)重置计时,如此反复下去,以此来确定系统和软件正常运行。
如果规定时间内没有喂狗,看门狗超时,说明系统或应用陷入循环、卡死,此时看门狗会发出复位信号让主控复位,脱离卡死。
iCore-3568JQ 带有一个内部看门狗和一个外部看门狗,外部看门狗的型号为:PC9202
12.2. 内部看门狗¶
内部看门狗的设备名称为/dev/watchdog
,使用方法如下:
# 写入任意内容(大写字母‘V’除外),开启看门狗,每 45 秒内需要写入一次(喂狗)
echo 1 > /dev/watchdog
# 写入大写字母 V 关闭看门狗
echo V > /dev/watchdog
也可以使用程序来控制:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <syslog.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
void main() {
unsigned char food = 0;
int fd_watchdog = open("/dev/watchdog", O_WRONLY);
if(fd_watchdog < 0) {
printf("FAILED to open /dev/watchdog, errno: %d, %s\n", errno, strerror(errno));
syslog(LOG_WARNING, "FAILED to open /dev/watchdog, errno: %d, %s", errno, strerror(errno));
exit(1);
}
// default timeout is 45s
sleep(40);
// feed the watchdog once
ssize_t eaten = write(fd_watchdog, &food, 1);
if(eaten != 1) {
printf("FAILED feeding watchdog\n");
syslog(LOG_WARNING, "FAILED feeding watchdog");
exit(1);
}
// close the watchdog
food = 'V';
write(fd_watchdog, &food, 1);
close(fd_watchdog);
}
注意事项: 内部看门狗在使用 open 函数打开后会立刻开始计时
参考文档:SDK/RKDocs(linux 为 docs)/common/watchdog
12.3. 外部看门狗¶
外部看门狗的设备名称是/dev/wdt_crl
,使用方法如下:
# 写入不同数字来开启看门狗并设置时间
# 数字 0,1,2,3 分别表示 0.64s,2.56s,10.24s,40.96s
# 开启并定时 10.24 秒,每 10.24 秒之内要写入一次,也可随时写入不同数字更改时间
echo 2 > /dev/wdt_crl
外部看门狗同样可以用程序控制,写法和内部看门狗一样,只需要修改设备名称和写入的内容
注意事项:
外部看门狗在使用 open 函数打开后不会开始计时,必须要写入数字才开始
外部看门狗只支持写入数字 0,1,2,3
目前 iCore-3568JQ v1.0 版本,外部看门狗开启后无法软件关闭,需要断电才能关闭
因此,如果开启外部看门狗之后想要烧写固件,请按住 recovery 断开电源再连接进入 loader 模式,使用 reboot loader 命令进入可能会被看门狗重启