Linux看门狗管理及在DM8168芯片上的应用
空间,应用程序通过内核驱动提供的API接口(通常以打开文件或ioctl方式),提供访问硬件设备的接口,比如打开看门狗(int fd = open(“/dev/wat chdog”,O_RDWR))。
4 Linux系统下看门狗的管理
Linux启动过程依次为U—Boot、内核及文件系统,最后是应用程序启动。在Linux系统启动过程中,启用看门狗可以有效监测系统状态,若异常导致看门狗溢出,系统会自动复位以试修复问题,从而提高系统的可靠性及健壮性。本节以DMS168开发板为例,介绍Linux各个启动阶段看门狗的管理。
4.1 U—Boot启动阶段
开发板上电后,执行U—Boot的第一条指令,然后顺序执行U—Boot启动函数。U—Boot启动内核的过程如下:
①硬件设备初始化。
②加载U—Boot第二阶段代码到RAM空间。
③设置好堆栈,跳转到start_armboot函数入口。
④start_armboot是U—Boot执行的第一个C语言函数。
⑤初始化本阶段使用的硬件设备。
⑥检测系统内存映射。
⑦将内核从Flash读取到RAM中。
⑧设置内核启动参数,然后启动硬件看门狗,通过访问控制寄存器来实现。该阶段可以设置看门狗超时溢出时间为120 s。以DM8168芯片为例(后面的代码都是基于该芯片实现),相关代码为:
__raw_writel(0xBBBB,WDT_WSPR);
__raw_writel(0x4444,WDT_WSPR);
__raw_writel(wdt_trgr_time,WDT_WTGR);
这样如果后续的内核解压及启动出错,看门狗超时可以复位开发板以重启,重新加载内核并试图修复。
⑨完成系统初始化工作,U—Boot进入主循环程序,处理用户输入的命令。在abortboot中,关闭看门狗,向控制寄存器依次写入:
__raw_writel(0xAAAA,WDT_WSPR);
__raw_writel(0x5555,WDT_WSPR);
若收到用户中断,U—Boot自动启动的命令后,关闭看门狗,以方便用户调试U—Boot、设置内核相关参数等信息。
⑩如果没有收到用户中断命令,U—Boot会拷贝内核镜像并解压内核,开始启动内核调用。
4.2 内核启动阶段
在U—Boot加载了内核之后,系统就进入内核启动阶段,此时,看门狗的管理控制也要由内核来接管。内核启动主要包括内核自解压、注册及加载硬件驱动程序、Flash分区等。
在内核启动时,内核程序会注册硬件看门狗的驱动程序,并执行probe探针函数,此时,内核接管U—Boot阶段的看门狗,即先关闭看门狗,然后再重新打开看门狗,并加载新的超时时长,此处设置wdt_trgr_time=120 s。
__raw_writel(0xAAAA,WDT_WSPR);
__raw_writel(0x5555,WDT_WSPR);
__raw_writel(0xBBBB,WDT_WSPR);
__raw_writel(0x4444,WDT_WSPR);
__raw_writel(wdt_trgr_time,WDT_WTGR);
这样可以保证文件系统在挂载或解压出错时,看门狗没有进行喂狗操作,从而导致120 s超时后重启。
在注册完硬件驱动程序之后,内核会挂载根文件系统并进行解压。
4.3 应用程序启动阶段
文件系统启动后,用户的应用进程也会开始启动。在这个阶段,通常会创建一个独立的守护进程,来接管看门狗。守护进程启动时,首先关闭内核阶段启动的看门狗,并重新启动看门狗设置超时时长,实现接管内核阶段看门狗的功能。在看门狗启动后,守护进程可以周期性地进行喂狗操作,并通过心跳的方式同用户进程通信,在收不到用户进程的心跳包消息时,即停止喂狗操作,这样看门狗会超时溢出导致系统重启,以进行故障修复。
守护进程通过看门狗中断响应函数,实现重启系统等操作,以恢复系统可用性。
至此,Linux从U—Boot启动直到应用程序完成过程中,看门狗都有相应的启动及管理。
4.4 看门狗管理小结
Linux系统下,U—Boot启动后打开硬件看门狗,保证内核解压及启动出现异常时重启;内核启动阶段,接管U—Boot下的看门狗并设置时间,可以保证文件系统挂载、解压及启动出现异常时重启系统;在进入文件系统后,守护进程接管内核阶段的看门狗,并定期地执行喂狗操作,这样在用户进程出现异常(退出)时,守护进程可以监测到异常,停止喂狗操作,看门狗超时复位系统。嵌入式系统中,重启是从故障中修复的最简单有效的方法,通过在启动的不同阶段启用硬件看门狗,可以有效保障系统异常时重启。
5 DM8168看门狗的管理
除了前文提到的Linux系统下看门狗的基础管理,DM8168芯片的硬件看门狗外围输出引脚,可以同时支持Reset和Interrupt信号,功能更加强大。
如果只是期望看门狗超时后能重启复位板卡,参考前节提到的方法,依次在Linux启动的各个阶段启用及管理看门狗即可,因为看门狗的溢出引脚直接连接电源及复位管理模块。
此外,如
- REDIce-Linux--灵活的实时Linux内核(11-12)
- linux文件系统基础(02-09)
- Linux标准趋向统一(11-12)
- linux基础技术(02-09)
- LINUX的目录树(02-09)
- 在Windows下启动Linux(02-09)