DSP

看门狗电路

2019-07-13 20:21发布

系统应该具有一定的自恢复功能,以防止意外发生时程序跑飞或者进入死循环。意外有很多,比如硬件的EMI干扰以及软件的内存泄露、程序健壮性等问题。看门狗,英文叫做watchdog,本质上是一个定时器电路,一般有一个输入(喂狗端,kicking the dog或service the dog)和一个输出(一般连接至另一部分的复位端,比如DSP的复位端)。 CPU正常工作时,程序会定期喂狗,使得看门狗计数器清零,如果超过一定时间没有喂狗操作,一般就认为程序运行发生意外,此时看门狗电路就会给出一个复位信号到CPU的复位端,使CPU强制复位,从而使得程序能够从跑飞或者死循环的状态跳出。 喂狗操作不能太过频繁,这样会造成资源浪费,此外,在系统设计之初,不建议使用看门狗,因为此时发生意外的可能性较大,且有些意外是必须要处理的。 F2812以及F2806x和F28335的看门狗计数器都是8位的,当其计数达到最大值时,看门狗模块会产生一个输出脉冲,为了防止看门狗计数器达到最大值,通常可以采用两种办法:一是禁止看门狗计数器;另一种方法就是定期喂狗,通过软件周期性地向负责复位看门狗计数器的看门狗密钥寄存器(WDKEY)写入0x55+0xAA,即紧跟着0x55写入0xAA,这样就可以使得看门狗计数器清零。 作者注1:如果采用定期喂狗的方式来防止看门狗计数器达到最大值,假如意外发生造成程序进入死循环,使得喂狗的代码段得不到执行,这样一来,看门狗计数器一旦溢出,便会造成CPU的复位。如果是单纯地禁止看门狗计数器,便无法通过看门狗计数器溢出来复位CPU。因而上述两种防止看门狗计数器达到最大值的方法是有本质区别的。 作者注2:可以利用看门狗计数器溢出来复位CPU,比如在DSP程序中增加如下死循环,使得定期喂狗的代码段得不到执行,从而通过看门狗计数器溢出来复位DSP。 while(1) { asm(" NOP "); } 参考文献:
1. 《手把手教你DSP:基于TMS320F28335》,北京:北京航空航天大学出版社,2015.1
2. 《手把手教你DSP:基于TMS320X281x》,北京:北京航空航天大学出版社,2011.4
3. TMS320x2806x Piccolo Technical Reference Manual