2 基于AT91RM9200的多级监控机制的实现
2.1 利用MAX6374设计外部监控器
在仲裁板上利用MAX6374芯片实现了专用的Watchdog电路。MAX6374足Maxim公司的一款低功耗Watchdog芯片,耗电仪5μA,封装为8引脚SOT23。其定时周期可通过对引脚SET2、SETl和SETO进行编程,从而获得不同的定时时间。MAX6374的定时周期如表1所列,电路原理图如图3所示。


MAX6374的输入端WDI与AT91RM9200的PIO端口直接连接,而输出端WD0则与AT91RM9200的nReset引脚相连。在实际使用中,将SETO、SETl和SET2分别设置为l、0和O。如果AT91RM9200在3 s内没有发出心跳信号,那么MAX6374将会在WDO端发出一个低电平脉冲,对AT91RM9200进行复位。此外,也可以通过FPGA对3个SET端口进行编程,以满足不同定时间隔的需要。
2.2 利用EPlC6设计外部监视器
除了使用MAX6374专用Watchdog电路之外,还可以利用FPGA设计另一个监控模块作为MAX6374电路的冗余。采用Altera公司的EPlC6 FPGA设计另一个外部Watchdog。A

图4中各个关键信号说明如下:
(1)模块符号
cpu0和cpul为双机容错系统中的两台机组符号;ARBITER为仲裁器的仲裁模块,完成主机标志的判断;DBOUT为仲裁器的数据通信模块,将各数据信号仲裁后与外界进行通信;WDT0和WDT1为Watchdog模块,分别监视相应的机组工作情况。
(2)输入/输出信号
wdiO和wdil为CPU发往各Watchdog的周期性心跳信号,用于标志CPU是否正常工作;IRQ0和IRQ1为中断请求信号,请求启动对应的CPU机组接管故障机组;nRESET0和nRESETl为CPU的复位信号;clk为ARBITER模块的同步信号。
外部Watchdog的主要Verilog代码结构如下:

可以看出,该模块的计数时间由时钟信号clk确定。本系统使用了40 MHz的时钟晶振,因此如果需要长为4 s的定时时间,则为计数器设置的计数值应当是40 000 000×4=160 000 000。经过4 s之后,如果该Watthdog没有收到处理器发来的心跳信号,则将通过FPGA的端口向AT9lRM9200的复位引脚发送低电平的复位信号。
wdi0和wdi1对仲裁器来说是异步输入的信号。这样很容易使得信号在FPGA中传输时,所需的时间不能精确估计,当两个信号同时发生跳变的瞬间,就产生了“竞争与冒险”。这在时序仿真后的波形中往往就会产生一些不正确的尖峰毛刺信号。另外,由于FPGA以及其他CPLD器件内部的分布电容和电感对电路中的毛刺基本没有过滤作用,因此这些毛刺信号会被“保留”并传递到后一级,从而使得毛刺问题更加突出。为此在设计中增加了图4中的clk信号作为全局的时钟同步信号。它也是FPGA的时钟信号,其作用是使由Watchdog发出的信号“同步”地输入到仲裁器中,这样可以消除毛刺信号。
clk同步化wd0和wdl的代码如下:

2.3 利用内部Watchdog模块设计内部监控器
AT9lRM9200内嵌Watchdog模块,用于在软件陷入死锁时防止系统锁定。其结构基于一个16位递减计数器,计数器值从AT91RM9200的寄存器ST_WDMR中载入,如图5所示。

当Watchdog复位时,ST_WDMR的值为0x00020000,对应于计数器的最大值;当Wathdog溢出时,在NWDOCF引脚上会出现一个宽度为8个慢时钟周期的Watchdog溢出低电平信号。在典型慢时钟频率为32.768kHz的情况下,使用慢时钟信号的128倍分频信号可确定最大Watchdog周期为256 s。在正常操作下,Watchdog定时器溢出发生前,可以通过设置ST_CR(控制寄存器)的WDRST位,定期重载Watchdog值。
若出现溢出,Watchdog定时器将会:①设置中断产生的ST_SR(状态寄存器)的WDOVF位;②若ST_WD-MR中的EXTEN位置位,则在Watchdog溢出信号中产生一个8周期的慢时钟低电平脉冲;③若ST_WDMR中RSTEN位置位,则会产生一个内部中断复位;④重载并重启递减计数器
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

