【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
大家如果做过工业级别的嵌入式设备,那么对看门狗应该不陌生。很多工业级的设备,其应用环境很多时候是非常糟糕的,甚至简单加一个塑料壳子,放在室外都是有可能的。在这么差的环境下,要保证系统持续稳定地运行,这就需要引入看门狗这个武器了。
所谓看门狗,就是要求系统定时去进行喂狗的操作。具体时间多长,可以自己设置。软件一旦没有及时喂狗,那么系统就会自动重启。这个操作,就是为了防止嵌入式系统出现死锁、软件故障、程序跑飞等各种异常情况。
1、文档说明
在Allwinner_V3s_Datasheet_V1.0.pdf芯片手册上面,看门狗是和timer放在一起的。这也算合理。相关的寄存器不多,主要就是5个,
从名字也能大概看出这5个寄存器的用途。第一个是中断开关,第二个是状态,第三个是控制,第四个是配置,第五个是模式。
2、电路
和之前的驱动都不同,看门狗完全是soc内部的模块设置,因此这个部分也就没有电路图,没有外部引脚的信号需要考虑。
3、设备树文件
查看sun8i-v3s.dtsi文件,输入wdt,可以很容易找到看门狗的内容,
wdt0: watchdog@01c20ca0 {
compatible = "allwinner,sun6i-a31-wdt";
reg = <0x01c20ca0 0x20>;
interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
};
内容也不复杂,第一个表明兼容什么样的soc,第二个表示寄存器地址范围,第三个表示中断号、中断形式。
4、查看驱动c文件
由之前的sun6i-a31-wdt在drivers目录下面做全局查找,不需要花很多的时间就可以找到驱动文件,即sunxi_wdt.c。文件中有这样的内容,
static const struct of_device_id sunxi_wdt_dt_ids[] = {
{ .compatible = "allwinner,sun4i-a10-wdt", .data = &sun4i_wdt_reg },
{ .compatible = "allwinner,sun6i-a31-wdt", .data = &sun6i_wdt_reg },
{ /* sentinel */ }
};
看到这个,基本就能判断出我们的驱动是加载对了。整个驱动基本上就是一个套路,对于驱动开发者来说,他所要做的就是把对应的回调函数填完就可以了,
static const struct watchdog_ops sunxi_wdt_ops = {
.owner = THIS_MODULE,
.start = sunxi_wdt_start,
.stop = sunxi_wdt_stop,
.ping = sunxi_wdt_ping,
.set_timeout = sunxi_wdt_set_timeout,
.restart = sunxi_wdt_restart,
};
5、验证和使用
通过查看官方soc文档,我们发现目前来说看门狗的最长喂狗时间是16s。当然,配小一点也是可以的,大家可以根据自己的需求灵活设置,
如果不想设置,那直接使用默认配置就好。这个时候为了验证看门狗有没有起作用,可以分成两步骤,第一,查看ls -l /dev/w*下面有没有watchdog这个节点;第二,给watchdog发送一个1的数据,即
echo 1 > /dev/watchdog
一段时间之后,如果发生了系统重启,那么代表看门狗生效。当然,没有生效的话,需要结合soc文档和kernel驱动打印日志,分析一下具体的原因了。当前,watchdog的驱动是默认打开的,大家不需要做额外的配置就可以开始测试了。
此外,正在做、或者将来准备做工业级设备的同学,可以好好看看相关的用法,未来肯定会涉及到看门狗的操作。当然,使用看门狗,只是最后没有办法的办法,嵌入式系统本身的稳定性还是需要研发人员努力去完成的。这和看门狗本身并不冲突。