详解RK平台看门狗程序:用mywatchdog.c实现灵活的超时控制与喂狗管理 电子说
在嵌入式系统稳定性保障中,看门狗程序的灵活性和易用性直接影响开发效率。今天我们聚焦一份实用的看门狗程序mywatchdog.c,看看它如何通过简单指令实现超时时间设置与喂狗开关控制,以及在实际场景中如何发挥作用。
先来看mywatchdog.c的核心逻辑,它的设计目标很明确:通过命令行参数快速配置看门狗超时时间,并控制喂狗行为,代码如下:
配置:
&wdt{status = "okay";};
测试指令:这种方式不灵活# 写入任意内容(大写字母‘V’除外),开启看门狗,每44 秒内需要写入一次(喂狗)echo A > /dev/watchdog# 开启看门狗,并且内核会每隔 22 秒自动喂一次狗echo V > /dev/watchdog
// 定义看门狗超时控制相关IOCTL命令int main(int argc, char *argv[]){int timeout;int fd;int ret = 0;// 打开看门狗设备节点,打开即启动看门狗(硬件特性)fd = open("/dev/watchdog", O_WRONLY);if (fd == -1) {perror("watchdog");exit(EXIT_FAILURE);}// 从命令行参数获取超时时间(第一个参数)timeout = atoi(argv[1]);printf("输入的超时参数:%d,实际设置值:%drn", atoi(argv[1]), timeout);// 设置看门狗超时时间ret = ioctl(fd, WDIOC_SETTIMEOUT, &timeout);if (ret < 0) {printf("设置超时时间失败n");goto fail;}// 验证并获取实际生效的超时时间(部分硬件可能限制最小/最大超时值)ret = ioctl(fd, WDIOC_GETTIMEOUT, &timeout);if (ret < 0) {printf("获取超时时间失败n");goto fail;} else {printf("当前看门狗超时时间:%d秒n", timeout);}// 循环喂狗(根据第二个参数控制是否实际执行喂狗操作)while (1) {// 注意:当前代码中喂狗操作被注释,实际使用时需根据需求开启// 若第二个参数为1则执行喂狗,0则不喂狗(触发复位)if (argc >= 3 && atoi(argv[2]) == 1) {ret = write(fd, "�", 1); // 喂狗核心操作:向设备写入1字节数据if (ret != 1) {ret = -1;break;}}printf("喂狗状态:%sn", (argc>=3&&atoi(argv[2])==1)?"已喂狗":"未喂狗");sleep(timeout - 10); // 间隔小于超时时间,预留缓冲}fail:close(fd);return ret;}
代码核心亮点:
1.支持通过命令行参数动态设置超时时间(argv[1]);
2.通过第二个参数(argv[2])控制喂狗开关(1 = 开启喂狗,0 = 关闭喂狗);
3.包含超时时间验证步骤,避免硬件不支持的超时值导致配置失效;
4.循环喂狗逻辑中预留 10 秒缓冲,降低因系统延迟导致的误复位风险。
将编译后的mywatchdog程序放在/etc/init.d/目录下,即可通过一条指令完成看门狗配置,这条指令的含义是:
|
# 设置超时时间为300秒(5分钟),开启喂狗功能,并后台运行
/etc/init.d/mywatchdog 300 1 &
|
•300:第一个参数,代表设置看门狗超时时间为 300 秒(若硬件支持,实际生效时间会通过WDIOC_GETTIMEOUT返回);
•1:第二个参数,控制喂狗开关(1= 开启喂狗,程序会每隔 290 秒执行一次喂狗;0= 关闭喂狗,系统会在 300 秒后触发复位);
•&:将程序放入后台运行,不阻塞当前终端,适合作为系统服务启动。
若要测试看门狗是否正常工作,可关闭喂狗功能:
|
# 设置超时10秒,关闭喂狗,观察系统是否在10秒后复位
/etc/init.d/mywatchdog 10 0 &
|
将程序加入系统启动脚本(如rc.local),确保系统启动时自动开启看门狗:
|
# 在rc.local中添加,系统启动后自动以300秒超时、开启喂狗的方式运行
/etc/init.d/mywatchdog 300 1 &
|
•代码中write(fd, "�", 1)是喂狗核心操作,实际使用时需取消注释(当前代码为注释状态,仅作演示);
•超时时间设置需结合系统最大响应时间(如系统完成一次复杂任务最长需 200 秒,则超时时间建议设为 250-300 秒);
•后台运行时可通过ps命令查看进程状态,通过kill命令终止:
|
# 查看mywatchdog进程
ps -ef | grep mywatchdog
# 终止进程(需先关闭看门狗,否则进程退出后可能触发复位)
kill [进程ID]
|
相较于固定配置的看门狗程序,mywatchdog.c的优势在于:
•参数化控制:无需修改代码即可调整超时时间和喂狗状态,适合不同场景(如调试、生产环境);
•兼容性强:基于 Linux 标准/dev/watchdog接口,不仅适用于 RK 平台,也可移植到其他支持标准看门狗驱动的嵌入式系统;
•易于集成:放入/etc/init.d/目录后,可通过系统服务管理工具(如systemctl)统一管理,符合嵌入式系统服务规范。
mywatchdog.c通过简洁的代码实现了看门狗的核心功能,而/etc/init.d/mywatchdog 300 1 &这条指令则将配置门槛降到了最低。在实际开发中,只需根据系统需求调整超时时间和喂狗开关,就能让看门狗成为系统稳定运行的“可靠后卫”。记住:好的看门狗程序,不仅要能 “守得住”,更要 “用得活”。
全部0条评论
快来发表一下你的评论吧 !