在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(watchdog)
单片机看门狗电路的作用看门狗的作用: 看门狗定时器是一个计数器,基本功能是在发生软件问题和程序跑飞后使系统重新启动。看门狗计数器正常工作时自动计数,程序流程定期将其复位清零,如果系统在某处卡死或跑飞,该定时器将溢出,并将进入中断。在定时器中断中执行一些复位 *** 作,使系统恢复正常的工作状态,即在程序没有正常运行期间,如期复位看门狗以保证所选择
的定时溢出归零,使处理器重新启动。软件的可靠性一直是一个关键问题。任何使用软件的人都可能会经历计算机死机或程序跑飞的问题,这种情况在嵌入式系统中也同样存在。由于单片机的抗干扰能力有限,在工业现场的仪器仪表中,常会由于电压不稳、电弧干扰等造成死机。在水表、电表等无人看守的情况下,也会因系统遭受干扰而无法重启。为了保证系统在干扰后能自动恢复正常,看门狗定时器(Watchdog TImer)的利用是很有价值的。
现今市面上流行的一些单片机,多嵌有内部WDT,如TI的MSP430系列,Philips的P87XXX和P89XXX系列,Microchip的PIC列,Atmel的AT89SXX系列和Holtek公司的Htxxx系列。但是这些内部看门狗在工作时,多存在一定的误差。一些工程师在设计的过程中,由于忽略了这一点,导致系统出现异常。MSP430系列单片机是美国德州仪器公司(TI)近几年开发的新一代单片机,该系列是一款16位、具有精简指令集、超低功耗的全新概念混合型单片机。在众多单片机系列中,由于它具有极低的功耗、丰富的片内外设和方便灵活的开发手段,已成为一颗耀眼的新星。其内部自带看门狗及复位电路,理论上如果程序跑飞,可用看门狗将其复位。但在实际使用过程中,发现看门狗的作用并非万无一失,以下实验证明了这一点。实验电路如图1所示。
试验程序清单:
#include《msp430x12.h》
void main(void){
p1dir l=0x0f; //设置p1.2-.p1.0为输出
for(;;){
volaTIle unsigned int i;
wdtctl=wdtpw+wdtcncl;
//复位wdt
piout==0x0t;
i=5000;
do(i--)
while(i!=0);
}}
上述实验启动后,如果程序正常运行,LED会闪烁。缺省时,MSP430的看门狗是允许状态,所运行的程序会不断地访问看门狗。理论上,这个系统是不会发生启动失败的,因为即使启动失败,看门狗也应该在数百毫秒内启动,复位整个系统。基于这种思想,对单片机的复位进行测试。K2断开,用K1连续产生。Reset信号,测试看门狗使系统重启的成功率。K2闭合,则reset端高电平,理论上K1不能有效产生复位脉冲,观察看门狗是否起作用。
实验结果与分析
实验结果如下:K2断开,连续开关K1,上电重启系统,平均155次失败1次(LED不闪),即看门狗失效概率0.6%;K2闭合,连续开关K1,平均18次失败1次(LED不闪),且一旦失败,将连续失败下去,看门狗无效率占到了约5.5%。另外,当采用同样具有内置看门狗的其他系列单片机替代实验中的MSP430,启动程序段作相应修改时,实验结果仍大致相同,这说明具有内置看门狗的单片机面临的问题是相同的。经分析可能有如下原因:
①由于看门狗的时钟不独立,计数时钟与系统为同一分频链路,因此看门狗不能在系统出现问题时有效运作。
②由于时钟可用软件设置,启动失败时,开机时钟可能处于空档,没有时钟看门狗不能生效。
③有些看门狗需要用软件设置或启动,因此启动失败后,初始化程序没有激活,CPU可能跳转到随机代码,使看门狗被禁止。这样的看门狗是需要有可靠的上电复位作保证的,因此,从理论上讲,原设计存在着不合理性。基于上述分析,采用片外看门狗专用芯片TPS3823由独立的分频振荡电路提供计数脉冲。实验电路如图2所示。
上述电路中,TPS3823输出定时溢出信号给Reset端。程序段中,CPU要不断地通过I/O口输出喂狗信号,使看门狗计数器清零。在此电路中重复上述试验中K1、K2的相同动作,系统重启成功率达到100%。
未来的内置看门狗必须有独立可靠的时钟。系统上电后,看门狗即为允许状态,无需软件设置,它只能被外部硬件跳线或内部熔丝(fuse)所禁止。目前,如果要求设计可靠性较高的嵌入式系统,外置看门狗是必须考虑的。内置看门狗的另一问题是系统复位后,程序应判断是由Reset端正常上电复位,还是程序跑飞看门狗所致,由此确定现场数据是否应该保留。这也是在看门狗应用中所应考虑的。
看门狗系统设计技巧外部看门狗是嵌入式系统工程师工具箱里重要且关键的工具,然而为了捕捉到故障,且预防故障的发生,看们狗必须设计得当。因此设计一个看门狗系统时应考虑以下5个秘诀。
技巧1—监测心跳
一个外部看门狗须具备的最简单功能是监测由主应用处理器产生的一个定期“心跳(Heartbeat)”信号,以及在心跳异常时发出一个错误信号。心跳监测可做为两种不同的用途:首先,在经过已在软件执行的功能检查之后,微控制器(MCU)应该只是生成心跳,以确保软件的正常工作。第二,如果系统的实时响应已受到损害,心跳应该要能显示出来。
为软件功能和实时响应监测心跳,可透过一个使用简单,“哑巴(Dumb)”的外部看门狗。外部看门狗应该有沿着一个心跳必须出现的窗口的能力调派一个心跳周期,心跳窗口的作用是当系统的实时响应受到损害时,允许看门狗进行检测。而在该功能或实时检查失败的情况下,看门狗会试图透过应用处理器的重置来恢复系统。
技巧2—采用一个低效能MCU
简易基于定时器的外部看门狗可在相对低成本的状况下监控心跳,但这会严重限制看门狗系统的能力和恢复的可能性。其实,低效能微控制器就可以做为外部看门狗的定时器,所以何不为看门狗增添一些智能且采用微控制器呢?微控制器的固件(Firmware)可被开发用来满足增加许多功能的心跳监测窗口所需。
一个“聪明”的看门狗有时被称为监督者或安全看门狗,且已在不同的产业,如汽车领域实际使用了许多年;另外,通常基于微控制器的看门狗以被主要用于安全关键应用。目前开发工具已相当可用且硬件成本也低,这样的设计具成本效益,且在其他的应用中亦是如此。
技巧3—监督关键的系统功能
使用一个小微控制器作为看门狗的决定,可开启看门狗该如何使用的无限可能。其中可赋予智能看门狗的第一个角色通常是监督的重要系统功能,如系统电流或传感器状态。看门狗如何能监督电流的一个例子是,采取一个电流的独立测量,并提供监测值给应用处理器,之后,应用处理器可比较看门狗与自身读取到的数值。若是两者之间有分歧,则系统将执行故障树(FaultTree)此一被应用程序视为适当的方式。
技巧4—观察一个信道
有时嵌入式系统可像个看门狗且应用处理器也可以如期工作,但外部的检查员是处于非响应的状态。在这样的状态下,绑定智能看门狗到一个信道如通用异步收发器(UART)是可行的。当看门狗被连接到信道时,不仅可以监控通道流量,还可以接收对看门狗而言的特定指令。
在这方面一个很好的例子是专为小型卫星设计的看门狗,其可监视飞行器计算机和地面基地台间的无线电通信。如果飞行器计算机变得不响应无线电,看门狗将接收到一个命令,然后执行并重置飞行器计算机。
技巧5—考虑外部定时重置功能
采用一个微控制器执行看门狗,会有额外功能增加其复杂性,以及一个新软件单元到系统的设计,因此,系统中看门狗的问题无疑是由工程师的头脑来监看。在看门狗自行“放大假”的情况下,其将如何恢复?
选择之一是使用前面讨论的哑巴外部看门狗定时器。智能看门狗会由哑巴看门狗的定时器,使其从被重置的状况下生成心跳;另一个选择是让应用处理器的行为就像个看门狗。这里须小心思考,给予最佳的方式以确保两个处理器如预期地保持正常状态。
简单设计确保看门狗可行性
智能看门狗的目的是监测系统和主微控制器,以确保它们依预期运作。在系统设计中,看门狗可允许其所支持的非常多功能,开发者需要牢记,增加智能看门狗复杂度的可能性,且看门狗本身须包含潜在的故障模式和错误。更重要的是,看门狗的设计应保持简单与采用最小的必要功能集,将可确保其可被彻底测试和验证。
看门狗技术及其抗干扰措施随着工业自动化水平的不断提高,以MCS-51单片机为核心所构成的单片机应用系统得到了广泛应用,如水泥生料配料系统、电子皮带秤给料控制、各种现场智能测量仪表等。但其工作现场条件恶劣,干扰多而且幅度大,严重影响着应用系统的正常运行与可靠性,甚至使应用系统计算机进入死循环而瘫痪,通常称为程序“跑飞”。由此引出的计算机可靠性问题,一直是人们研究的重要课题。
采用屏蔽、滤波、退耦、隔离、接地等措施能有效地提高系统的抗干扰能力,但很难在强干扰发生时消除因程序“跑飞”而死机情况的发生。“看门狗”技术能在程序“跑飞”时实现自我诊断并使系统恢复运行,是单片机应用系统抗干扰的有力武器。当然,它是以系统的硬、软件设计开发的合理和成熟为条件的,否则将掩盖系统设计开发过程中的人为缺陷与不足。
“看门狗”技术及其对干扰的抑制1、程序“跑飞”对系统的攻击
(1)程序计数器PC的值被攻击,成为一随机拼合的数据。
(2)系统设置的控制字与标志参数因“跑飞”后可能被访问而被攻击。
(3)数据存储器RAM内容被攻击等。
2、 “看门狗”技术
“看门狗”源于“Watch dog、Watch dog timer”,或称定时监视技术,其本质是一可复位的定时器,其原理如图1、2所示。
在程序正常运行时,计算机通过程序以周期T1向定时器发送脉冲触发定时器(或通过软件以T1为周期初始化定时器),而由定时脉冲控制的定时器动作时间为T2(T3),在T1<T2(T3)时,定时器不会动作,处于休眠状态。当计算机受到强干扰等作用破坏后,程序计数器PC中内容不再是程序的正确代码,而可能为一随机拼合的数据,这样会使取指不正确,必然导致程序运行混乱“跑飞”,进入死循环而死机。反过来由于程序脱离正常循环,也使定时器触发脉冲丢失,在经过T2(T3)时间后,“看门狗”定时器被激活,向CPU发出Reset信号使其复位,将“跑飞”的程序从PC=0000H开始,纳入正常轨道。但有些生产过程是不能从头开始的,应用程序均是一循环体,且在开始处均有初始化程序,包含各种寄存器、指针、变量、控制字等。此时状态不能反应“跑飞”时的状态,有时还有人身、设备等方面的安全危险。在这种情况下,程序“跑飞”后应设法找到出错时的断点,此时就可以采用二级“看门狗”的方式。由程序设计时优先级设置为最高级的定时器一先发出中断请求信号,CPU响应中断转向中断处理程序,进而恢复系统。第二级“看门狗”电路只有在第一级未起作用时经过T3才起动Reset信号。
3、 “看门狗”技术的实施方法
(1)在系统构成时选用芯片内带有“看门狗”电路的单片机,如ATMEL公司的89C52等。
(2)选配专门的“看门狗”电路,如美国Xicor公司的X25043/45、MAXIM公司的MAX813L等,它们均可构成独立的“看门狗”电路。
(3)采用计数器、单稳态触发器、定时器等器件构成。在图3中用4060构成了一个二级“看门狗”电路。
因/I/N/T/O中断入口0003H处仅有0003H~000AH单元可为中断服务程序所用,很可能容纳不下中断服务程序,故应在其内安排一条JMP Watch dog指令。由于“跑飞”,PC值在响应中断前已被破坏,在响应中断后,该内容自动被压入堆栈,故一定要用两条POP A指令将无用内容d出,以便为中断返回时由堆栈给PC赋予“跑飞”处的正确值,这一点在设计中断服务程序时尤其要引起重视。通过对P1.0取反,恢复对4060的触发脉冲。在中断服务中应安排被破坏数据的诊断、修复以及查找“跑飞”处的地址正确入口,并在返回前将其压栈。当执行RETI时,“跑飞”处断点地址入口自动d栈到PC,恢复正常运行。P1.0取反指令在何处插入应通过计算指令周期让两条CLR P1.0指令间隔小于定时器的定时时间T1<T2,可取T2=(1.5~2)T1。
(4)利用8031片内定时器/计数器 8031片内有两个十六位的定时器/计数器,可用定时器T0。在应用程序对T0初始化时,将其定时时间T2设置得比应用程序循环体执行时间T1长,可取:T2=(1.5~2)T1。当程序正常时,T0不会溢出,“跑飞”时溢出,定时器/计数器控制寄存器TCON的TF0(TCON.5)由8031内部硬件置位TF0=1,发出中断信号。设8031采用12MHz晶振,经定时器内部12分频后得1MHz的定时时钟,对应定时时间1μs,最长可定时约65.5ms,如应用程序循环时间T1=10ms,则可取T2=2T1=20ms,定时器的初值X可由下式确定:
(216-X)×1μs=20ms
X=45536D=B1EOH
定时器的初始化程序:
MOV TLO,#OEOH
MOV THO,#OB1H;定时器/计数器T0写入初值
MOV TMOD,#O1H;设置定时器/计数器工作方式1
SETB TRO; 起动定时器/计数器T0
在应用程序的系统初始化时用下面指令设定T0优先级:
SETB EA; 开放中断
SETB ETO; 允许T0中断
SETB PTO; 置T0中断优先级最高
T0中断服务流程与/I/N/T/O中断服务流程(见图4)相比,其中断入口为000BH,去掉P1.0取反的指令,其余相同。靠优先级别最高的中断将控制权重新夺回交给CPU,使系统恢复正常。
6
4、 断点的查找与恢复
断点的查找与恢复是人们最关注的问题,我们的方法是扩展一外部数据存储器,用以存储“跑飞”前断点(或接近断点)的PC之值以及一些重要的变量、指针及控制字的值。利用正常工作时P1.0向“看门狗”发送的触发脉冲经反向、延时等作为外部扩展RAM的片选信号以T1为周期定时对外部RAM中内容进行刷新。当“跑飞”后因触发脉冲丢失而避免了外部RAM被攻击,保证其内容的可靠性。随着T1的减少,被恢复的值就愈趋近断点值,但要非常准确找到断点,还值得人们研究。在中断响应时由于P1.0恢复了输出触发脉冲,故可将断点值读出。
结束语
“看门狗”是对付“跑飞”的有力手段,在生产过程中由于特定的生产条件使得“看门狗”技术有其相当的作用。我们在对某水泥厂微机配料系统的技术改造过程中采用了二级“看门狗”技术,该系统运行两年多来经受住了各种强干扰的考验,取得了令人满意的效果。
对于“跑飞”后的诊断、恢复,尤其是如何更准确地找到程序“跑飞”断点,对被损数据加以恢复等方面尽管有许多软件可以利用,但还是值得人们多加关注的问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)