嵌入式操作系统应用中的看门狗技术<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
广东能兴科技发展有限公司 曹敏煊
引 言
随着32位微控制器在嵌入式产品中的广泛应用,嵌入式操作系统也逐渐被大量应用,如uC/OS、VxWorks、uClinux、Linux 和WinCE 等,由于嵌入式操作系统的使用,大大降低了复杂应用系统中软件开发的工作量,使得嵌入式软件能够采用现代的软件开发技术进行代码编写和调试,从而也提高了软件的质量。
但在嵌入式系统中,对系统的可靠性有很高要求,软件要有崩溃自恢复功能,能够长时间不间断地运行。本文将介绍在嵌入式操作系统中如何使用看门狗技术,提高嵌入式系统的整体可靠性,并以u c l i n u x 在三星S<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />3C4510 系统上的看门狗(Watchdog)应用,说明其使用方法。
1 几种不同的看门狗应用情况
在嵌入式8/16 位单片机系统中,一般采用DS1232、IMP706等带看门狗功能的复位芯片或自带看门狗功能的M C U 对系统进行看门狗管理。在这些系统里,一般不区分操作系统和应用软件,整个软件一般由开发者自行编写。软件开发人员可以根据需要在程序中的合适位置编写清狗指令,达到管理看门狗的作用。相信这种方法已经为大部分的嵌入式开发者熟悉和使用。
对于32位系统,一般采用操作系统。操作系统的工作过程是:首先初始化硬件系统,然后装载内核并运行,接着装载并初始化设备驱动,之后调用应用程序。一般的清狗指令可以放在两个地方:内核或应用程序。一般的嵌入式操作系统内核都有看门狗选项,可以将看门狗功能编译到内核里面。但将看门狗放在内核里有一个问题,就是如果应用程序因为软件缺陷在运行过程中意外退出或跑到意外的地方,系统内核仍可能正常在运行,也就是仍然会不断有清狗的命令在执行。虽然造成应用程序异常,但系统却不能自动复位重新运行。如果把看门狗放在应用程序中,一旦应用程序发生异常,将导致清狗指令长时间得不到运行,系统将重新复位运行。因此,将看门狗放在应用程序中是更为可靠的方法。
清狗方式可以有两种:一种是如果M C U 支持的话,可以采用片内清狗方式;另外一种是片外清狗,通过专门的看门狗芯片如DS1232、IMP706 等实现看门狗功能。片内清狗方式可以在应用程序开始的地方启动片内看门狗,在程序的主循环中再进行清狗。片内清狗方式的优点是片内看门狗一般不会在启动后自动运行,有利于程序的初始化运行。不足的地方是不能够观察到清狗的运行情况。片外清狗的方式的优点是可以直接观察清狗信号,但在系统上电后会马上进入看门狗状态。DS1232 的最长清狗周期为1.2s ,IMP706 为1.6s。如果软件不能够很快地进入清狗状态,系统将无法正常运行。
对于uC/OS、VxWorks 等基于ROM 运行方式的操作系统,由于其启动时间很短,大部分都小于0.5s ,可以在应用程序中编写清狗指令。系统复位以后,内核很快就启动,进入应用程序,达到循环清狗状态,不存在很大的问题。
但对于Linux 或WinCE 等基于RAM 运行方式的操作系统,情况就比较复杂。这些操作系统由于采用了基于R A M 的运行方式,与一般的PC 机方式一样,可以充分利用DRAM的快速存储速度,加快整个软件系统的执行速度,是高速、复杂嵌入式系统以后的发展趋势。但基于R A M 运行的操作系统,在启动时需要一个自解压的过程,把整个内核文件从F l a s h 调入R A M 中,再解压运行,初始化设备驱动,调入应用程序文件到R A M 中,最后才运行应用程序。对于比较复杂的应用系统,由于需要在内核中装载很多的设备驱动、文件系统、通信协议等,使得整个启动过程耗用的时间比较长,往往需要1~10s 不等。
解决方案一 是自己做一个清狗周期更长的硬件电路,因为市面上很少有周期超过2 s 的看门狗芯片。但这样将延长系统自恢复的响应时间
解决方法二 是修改内核,在内核启动过程中将看门狗设成无效。
2 片外清狗的操作方法
下面以u C l i n u x 在三星S3C4510系统为例说明
S3C4510 没有片内看门狗,该系统的上电复位和看门狗芯片采用IMP706T,原理图如图1 所示。
图1 中,S1 为复位按钮,WDI 接S3C4510 的P0 脚。
根据芯片说明书,IMP706的WDI输入脚在R S T 输出非复位电平后,如果1.6s 内引脚电平没有上升沿或下降沿跳变,将在WDO脚产生低电平。但如果WDI 脚浮空,看门狗功能将失效,不受1.6s 限制。
S3C4510 的GPIO 引脚可以在软件中设定为输出或输入型当,设为输入型时引脚为高阻状态相当于浮空。
uClinux 在启动的时候先在ROM 上运行一段引导代码:该代码放在arch/armnommu/boot/compressed/ 目录下面的head.S 中。这段代码主要是初始化CPU 寄存器,装载内核文件到R A M 中,并进行解压缩。如下代码,修改其中的I/O 模式部分。
/* 置系统参数*/
ldr r0, =SYSCFG
ldr r1, =rSYSCFG
str r1, [r0]
/*置复位存储器映射 */
adr r0, SDRAM_SYSINIT_RESET
ldmia r0, {r1-r12}
ldr r0, =SYS_INIT_BASE
stmia r0, {r1-r12}
/* 点亮LED */
ldr r0, =IOPMOD
ldr r1, =0xFE /*将P0设为输入状态*/
str r1, [r0]
ldr r0, =IOPDATA
ldr r1, =0x7F
str r1, [r0]
/* 把映像拷贝到RAM */
ldr r0, =0x0
ldr r1, =0x200000 /* 2M */
ldr r2, =0x1000000
经测量,启动时IMP706T 的WDI 引脚电平为1.8V 左右,这样,整个内核启动过程中,看门狗将暂时失效。但应用程序运行后,应重新将P0设为输出模式,并在程序的主循环或有较长时间的操作中加入清狗的操作。这时,IMP706T 的看门狗将启动,监控整个系统的运行情况。实践证明,在应用程序发生意外时,能够在短时间内系统自动复位重新运行。
结 语
本文分析比较了看门狗技术应用于不同系统中的情况,并着重介绍了uClinux 的片外清狗方式。随着32 位高性能MCU 的广泛使用,L i n u x 等高级操作系统在嵌入式领域中也会逐步推广。上面所介绍的一些方法和注意点有助于软件开发人员提高系统的可靠性,使采用高级操作系统的嵌入式系统,除了具有现代软件技术的特点外,还可以拥有与常用单片机系统一样的可靠性。
文章评论(0条评论)
登录后参与讨论