写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启动后将会始终运行。如果因程序死锁或其他原因导致处理器崩溃,那么Watchd
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处理器构建了具有温备功能的双机容错系统。该系统采用一级冗余、两级监控的高可靠设计方案,具有实现简单、成本低等优点,能够满足一般关键领域对嵌入式系统的需求。经实践证明,该系统能够应对发生于板级和处理器级的故障,延长了系统的平均故障间隔时间,应用效果较好。
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

