本文设计了一种以AT91RM9200处理器为核心的高可靠嵌入式系统。系统具有两台机组,当一台机组发生故障后,另一台机组接管工作并继续运行。系统提供外部和内部Watchdog(看门狗)监控机制构成一级冗余、两级监控的可靠性设计方案。其中外部Watchdog分别采用MAX6374和以EPlC6 FPGA构建的监控电路,而内部Watchdog则利用AT91RM9200自带的Watchdog模块实现。本文分别从硬件和软件两个角度阐述系统的实现。
1 系统总体结构设计
1.1 AT91RM9200处理器
AT91RM9200是Atrnel公司生产的一款工业级ARM9处理器,内嵌ARM920T ARM Thumb处理器核,主频为180 MHz时性能可达200 MIPS,并内置16 KB SRAM和128 KB ROM。外部总线接口(EBI)支持SDRAM等存储器,带有7个外部巾断源,1个快速中断源和4个32位PIO控制器,最多支持122个可编程I/O端口。同时该芯片还内嵌Ethemet MAClO/100M接口,并提供USB 2.0全速主机端口与设备接口,以及其他常用的外部接口。
1.2 系统结构设计
为了提高可靠性,本系统采用基于温备的系统级可靠性设计方案。温备是在热备和冷备的基础上发展起来的一种双机容错技术,它是指两台机组同时加电,但只有主机处于工作状态,备机处于“温态”(空转等待接管主机工作的状态)。当主机发生故障时,由备机接替主机继续工作。故障机修复完毕后成为新的备机。与热备相比,温备方案具有实现简单、性能稳定等优点;相对于冷备方案,温备方案中的备机能够在主机故障后快速重启系统,从而最小化系统短时故障造成的损失。
系统具有两个处理器模块,每个处理器模块都以AT9lRM9200作为计算核心,称为“机组”。每台机组可以单独成为一个独立的子系统完成各项任务。系统还具有一块仲裁板,用于仲裁数据信号以及控制双机的工作方式。系统结构框图如图l所示。
利用AT91RM9200自带的多种外设接口,每台机组中除了具备处理器模块之外,还带有以太网接口、USB接口(用于连接USB接口无线网卡)和RS232串行接口。利用网络通信的特有工作方式,每台机组上的有线网络接口连接到一个集线器,USB接几无线网卡工作于managed模式,因此网络接口信号不需要集中的仲裁输入/输出,系统只需仲裁板提供对串口输入/输出信号的仲裁。这种方式也为双机之间传递同步信息提供一种有效途径:运行于双机中的应用程序可以利用有线网络或无线网络传递同步信息,当主机发生故障后,备机中的用户程序可以从最近的同步点开始工作,从而最小化主机故障造成的损失。
仲裁板上的控制逻辑通过两台机组的控制信号接口获取各机组当前工作状态,从而判断当前系统的工作模式,并据此控制机组与外部设备的连接。控制逻辑还负责向两台机组提供当前系统的工作状况,以便为运行于机组中的应用程序提供决策参考。
1.3 系统可靠性方案设计
为了提高整个系统的可靠性,须根据温备的特点设计各种监控机制。本系统针对每一台机组均设有Watchdog电路用于监控机组运行。一旦某台机组发牛故障,经过一定时间后,故障机相应的Watchdog会检测到故障的出现,并通过向故障机组发送nReset信号复位故障机组,同时向另一台机组发送IRQ信号以通知接管工作。控制逻辑保持主机与外部设备的连接,一旦主机发生故障,控制逻辑将更改工作状态,接通新主机与外部设备的连接。
在系统中,采用内部和外部两级监控策略。内部监控方案利用AT91RM9200处理器内部Watchdog模块实现;外部监控方案则利用仲裁板中的EPlC6 FPGA和专用Watchdog芯片MAX6374实现。其中,MAX6374芯片是实现外部监控功能的主体。当MAX6374损坏时,则采用位于EP1C6内部利用硬件描述语言实现的Watchdog接管外部监控工作,从而构成冗余的外部监控机制。内部监控机制的优先级低于仲裁板上外部监控机制的优先级。如果仲裁板上的两个Watchdog均发生失效,因而不能重启CPU板时,AT9lRM9200的内部Watchdog将会发生作用,重启CPU。这是通过控制内外两种Watchdog计数时间的长短来实现的。将MAX6374的定时时间设置为3s,EPlC6的定时时间设置为4s,而AT9lRM9200内部Watchdog定时时间设置为5 s。因此AT91RM9200内部软件Watchdog和仲裁板上的硬件Watchdog构成了系统中的两级监控、一级冗余的监控机制。系统的可靠性设计方案示意图如图2所示。
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。AT91RM9200发出的心跳信号经过机组上的控制信号接口输入到EPlC6中,对EPlC6内部自定义的Watchdog进行周期性的硬件复位;此外,EPlC6还负责仲裁两台机组各自的串口信号。具有Watchdog功能和仲裁功能的FPAG模块称为“仲裁器”。图4是仲裁器的结构功能图。
图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 0004=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位置位,则会产生一个内部中断复位;④重载并重启递减计数器。
写ST_WDMR不会重载或重启递减计数器,只有当对ST_CR写入后,Watchdog计数器才立即由ST_WDMR中载入值并重启。在使用AT91RM9200内部Watchdog时,需要设定Watchdog工作方式,对AT91RM9200处理器进行内部复位。具体的设置方式如下:
为了防止Watchdog溢出.需要周期性地置位寄存器ST_CR,从而完成对Watchdog计数值的复位。
在Atmel公司为AT91RM9200配置的ARM Linux操作系统中,已经提供了AT91RM9200内部Watchdog的使用接口。在配置好了内部Watchdog的ARM Linux操作系统中,会创建/dev/misc/Watchdog设备文件,所有针对AT9lRM9200内部Watchdog的操作均可以通过访问该设备文件来完成。具体的操作方法如下:
(1)打开内部Watchdog
使用该方法后,Watchdog会启动并开始计数。如果在Watchdog的计数时间内不对Watchdog复位,那么系统将会重新启动。
(2)复位内部Watchdog
Watchdog启动后将会始终运行。如果因程序死锁或其他原因导致处理器崩溃,那么Watchdog将无法复位成功,在Watchdog计数完毕之后将重启AT91RM9200,使系统重新运行。这种方法为提高系统的可靠性,防止软件死锁,或者强电磁干扰导致的处理器失效提供了一种有效的保护手段。
2.4 AT91RM9200心跳信号的发送
系统中的两个外部监控电路均需要AT9l RM9200提供周期性的心跳信号,以便监控系统的状态;同时AT91RM9200也要获取外部监控电路发送的中断信号,然后更改系统中机组的运行状态。以上功能均需要直接对机组中的AT91RM9200进行操作。可以通过对AT91RM9200的PIO端口进行周期性的电平置位/复位来实现心跳信号的发送。
AT91RM9200共有4组PIO控制器(即PIOA、PI-OB、PIOC和PIOD),每个PIO控制器分别控制32个PIO端口。每个PIO端口具备多种功能,如普通输出、同步数据输出、普通输入、中断源、外设选择等。对于心跳信号的发送,需要将PIO端口设置为普通输出功能,有关PIO的控制主要通过AT9lRM9200的GPIO控制器完成。在本设计中,将NCST/PCI3端口作为AT91RM9200心跳信号的发送端口,针对NCS7端口的输出设置如下:
PIOC_OER|=0xD; /*使能NCS7的输出功能*/
PIOC_PER|=0xD; /*设置NCS7端13为PIO控制器控制*/如果要将NCS7端口设置为高电平,则采用如下方法:
PIOC_SODR|=0xD; /*设置NCS7端口为高电平*/如果要将NCS7端口设置为低电平,则采用如下方法:
PIOC_CODR|=OXD;/*设置NCS7端口为低电平*/其中,PIOC_OER,PIOC_PER、PIOC_SODR和PIOC_CO-DR分别为PIOC控制器中的输出使能寄存器、PIO使能寄存器、置位输出数据寄存器和清零输出数据寄存器。AT91RM9200心跳信号的发送由系统软件中一个单独的进程负责控制。
2.5 AT91RM9200中断服务程序设计
当机组正常工作时,系统程序向仲裁板上的外部监控模块发送心跳信号,即信号WDI。外部监控模块通过两台机组发送的心跳信号判断当前双机容错系统的工作状态。如果经过特定的时间后,仲裁板上的Watchdog模块没有收到某台机组发送的心跳信号,则会向另一台机组发送中断信号,通知其采取相应的操作。如果另一台机组为备机,则备机上的系统程序将会随即启动用户程序;如果另一台机组为主机,则主机不会进行任何操作,因为此时用户程序已经在主机中运行。发生故障的机组将会通过重新复位,尝试故障的修复。在机组中运行的中断服务程序负责接收外部Watchdog发送的中断信号。针对AT91RM9200进行外部中断处理可以有两种方案。
(1)利用AT91RM9200的外部中断源
由于AT91RM9200自带7个普通外部中断源和1个快速中断源,因此可以直接将AT91RM9200的任意外部中断引脚与系统的外部Watchdog的输出中断信号相连。
例如,如果要使用AT91RM9200的IRQ0引脚作为中断源,则需在AT91RM9200的驱动程序中采用如下的方法进行设置:
request_irq函数是Linux操作系统中的中断申请函数。该函数向操作系统申请中断号为AT91C_ID_IRQO的中断,并通知操作系统该中断的中断处理函数为at91_interrupt_IRQ0。随后,定义at91_interrupt_IRQ0函数:
这样,一旦AT91RM9200的IRQO端口发生由高到低的电平跳变,则会引发at9l_interrupt_IRQO函数的执行。
(2)利用AT9lRM9200的PIO端口作为中断源
除了利用AT91RM9200自带的外部中断源之外,也可以利用AT9lRM9200提供的丰富的PIO端口作为中断输入。本系统中,使用AT9lRM9200的GPIOC7引脚作为中断源,此时需要在AT91RM9200的驱动程序中采用如下方法进行设置:
request_irq(AT91C_ID_PIOC,at91_interrupt_PIOC,O,“at91Rm9200 interrupt PIOC”,NULL);
该函数向操作系统申请了中断号为AT91C_ID_IPIOC的中断,并且通知操作系统该中断的中断处理函数为at91_interrupt_PIOC。为了使能PIOC控制器的中断功能,还需要设置相应的中断控制寄存器:PIOC_IER|=0x7;
可以在中断处理函数中添加启动用户程序的代码,这样,一旦AT9lRM9200接收到Watchdog发出的中断信号之后,将会调用中断处理程序从而启动用户的应用程序。
结语
本文利用AT91RM9200处理器构建了具有温备功能的双机容错系统。该系统采用一级冗余、两级监控的高可靠设计方案,具有实现简单、成本低等优点,能够满足一般关键领域对嵌入式系统的需求。经实践证明,该系统能够应对发生于板级和处理器级的故障,延长了系统的平均故障间隔时间,应用效果较好。
责任编辑:gt
评论
查看更多