Linux看门狗管理及在DM8168芯片上的应用
扫描二维码
随时随地手机看文章
摘要:随着智能手机及平板为代表的嵌入式设备的普及,对系统的可靠性提出较高的要求。以TI TMS320DM8168芯片为例,详细介绍了Linux系统从U—Boot启动、内核启动到文件系统加载及用户程序启动过程中,看门狗的启用及管理,通过不同阶段管理看门狗,可以保证系统在任意可能出现问题的阶段,可以自动重启以修复故障,从而有效提高系统的可靠性。
关键词:Linux;看门狗;DM8168
引言
随着智能终端及移动互联网的发展,Linux系统被应用到越来越多的嵌入式设备中,如移动通信基站、Android(基于Linux内核)智能手机、智能手环等。不同领域的应用都对Android/Linux系统的可靠性及可用性有严格的要求。在嵌入式系统中,CPU必须可靠工作,即使因为某种错误或异常进入错误状态,系统应该可以自动复位,看门狗也可以在系统进入错误状态后的一段时间内重启复位,以实现系统自动从故障恢复。
1 看门狗的概念
看门狗是一个进行累加计数的定时器,在其启动后,如果在设定的时间间隔内对定时器清零(俗称“喂狗”操作),定时器就不会溢出,也不会产生复位信号;如果在设定的时间间隔内,没有对定时器清零,定时器就会溢出产生复位信号,从而实现系统重启。根据实现方式的不同,可以分为硬件看门狗和软件看门狗。
硬件看门狗是利用定时器电路实现,其输出连接到电路的复位端,程序在设定间隔内对定时器清零。因此程序正常工作时,定时器不会溢出;如果程序出现故障,未能在设定间隔周期内执行清零操作,就使得看门狗定时器溢出,产生复位信号并重启系统。软件看门狗原理上同硬件看门狗一样,只是将硬件电路上的定时器用操作系统内部的软件定时器代替,这样可以简化硬件电路设计。但软件定时器在可靠性方面不如硬件定时器,在一些异常的情形下,比如处理器或操作系统内部发生故障时,会导致软件定时器不可用,也就无法检测到这些故障。
2 Linux系统对看门狗的支持
Linux内核从1.3.51版本开始提供硬件、软件看门狗的驱动支持。随着内核版本不断更新与发展,Linux内核对各种不同类型的硬件看门狗提供了广泛的支持。根据访问方式的不同,Linux系统下的设备驱动程序分为字符设备及块设备。看门狗在Linux系统下作为字符设备来处理,/dev/watchdog是一个主设备号为10、从设备号为130的字符设备节点。
Linux系统下的硬件看门狗,必须有硬件电路支持,设备节点/dev/watchdog对应着真实的物理设备,不同类型的硬件看门狗设备由相应的硬件驱动管理。
软件看门狗则由Linux内核模块通过定时器机制实现,此时设备节点/dev/watchdog并不对应真实的物理设备,只是为应用提供了一个与操作硬件看门狗相同的接口。各种不同类型的硬件看门狗电路,不仅提供了驱动程序支持,还提供了一个基于定时器的纯软件看门狗驱动,其驱动程序的源码位于Linux内核源码下面的/drivers/watchdog目录。
与Linux下的软件看门狗相比,硬件看门狗具有更高的可靠性。基于Linux内核的定时器实现的软件看门狗,当内核或中断出现异常时,将会失效。而硬件看门狗由自身的硬件电路控制,独立于内核,无论当前系统状态如何,如果硬件看门狗在设定的时间间隔内没有被执行写操作,仍会重新启动系统。
Linux系统下面的软件、硬件看门狗对应用程序而言是透明的。应用程序操作软件看门狗的方式如下:打开设备/dev/watchdog,在设定的时间间隔内对/dev/watchdog设备执行写操作。在任意时刻,只能有一个看门狗驱动模块被加载,管理/dev/watchdog设备节点。如果系统没有硬件看门狗电路,可以加载软件看门狗驱动模块。
3 Linux系统下看门狗的访问
前文提到,Linux系统将看门狗作为一个字符设备来管理。本节将以TI公司推出的高清视频处理芯片TMS320DM8168(以下简称DM8168)芯片为例,介绍Linux下访问及操作看门狗的逻辑层次。
DM8168芯片将高清多通道系统的所有捕获、压缩、显示以及控制功能整合于同一芯片,芯片内部集成了硬件看门狗,外围连接电路如图1所示。硬件看门狗溢出同时产生复位(Reset)及中断信号(Interrupt),复位信号会复位整个芯片,中断信号可以在捕获到中断事件后,在中断处理函数中增加一些额外的操作(比如将收到的看门狗溢出中断的时间写进日志,然后再复位等)。
Linux系统访问硬件接口需通过设备驱动程序接口实现,硬件看门狗也不例外。
如图2所示,Linux系统下操作看门狗需要以下3个层次:
①Hardware Layer-硬件层,指硬件设备,通常提供GPIO;
②Kernel Layer-内核层,内核通过设备驱动程序访问并控制硬件设备;
③Usee Space-用户空间,应用程序通过内核驱动提供的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语言函数。[!--empirenews.page--]
⑤初始化本阶段使用的硬件设备。
⑥检测系统内存映射。
⑦将内核从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启动的各个阶段启用及管理看门狗即可,因为看门狗的溢出引脚直接连接电源及复位管理模块。
此外,如果想在看门狗超时溢出时增加一些额外的处理,可以采用捕获中断信号的方法。具体流程如下:
①注册硬件看门狗中断处理函数,实现程序为omap_irq=platform_get_resource(pdev,IORESOURCE_IRQ,0); //获得中断标号
ret=request_irq(omap_irq,omap_wdt_irqhdl,0,pdev->name,wdev); //注册中断
其中omap_wdt_irqhdl为看门狗的中断处理函数。
②在硬件看门狗中断处理函数中可以增加一些附加的处理,需要注意的是,此时需要设置另外一组寄存器WDT_WDLY,以保证在复位前捕获到中断信号。
中断处理函数omap_wdt_irqhdl的关键实现程序为:
采用此方法后,看门狗超时产生中断信号,系统捕获到中断信号后自动触发中断响应函数,可以更灵活地处理(比如不复位系统,保留现场以便定位问题)。
结语
本文以TI公司的TMS320DM8168芯片为例,详细介绍了Linux系统从U—Boot启动、内核启动到文件系统加载及用户程序启动过程中看门狗的启用及管理,通过不同阶段管理看门狗,可以保证系统在任何一个可能出现问题的阶段,自动重启以修复故障,从而有效提高系统的可靠性。在嵌入式设备越来越普及的今天,设备自恢复功能会具有极大的竞争力。