用AT91 RM9200構(gòu)建高可靠嵌入式系統(tǒng)
關(guān)鍵詞 AT91RM9200 Watchdog雙機客錯系統(tǒng) 溫備 高可靠系統(tǒng)
本文設(shè)計了一種以AT91RM9200處理器為核心的高可靠嵌入式系統(tǒng)。系統(tǒng)具有兩臺機組,當一臺機組發(fā)生故障后,另一臺機組接管工作并繼續(xù)運行。系統(tǒng)提供外部和內(nèi)部Watchdog(看門狗)監(jiān)控機制構(gòu)成一級冗余、兩級監(jiān)控的可靠性設(shè)計方案。其中外部Watchdog分別采用MAX6374和以EPlC6 FPGA構(gòu)建的監(jiān)控電路,而內(nèi)部Watchdog則利用AT91RM9200自帶的Watchdog模塊實現(xiàn)。本文分別從硬件和軟件兩個角度闡述系統(tǒng)的實現(xiàn)。
1 系統(tǒng)總體結(jié)構(gòu)設(shè)計
1.1 AT91RM9200處理器
AT91RM9200是Atrnel公司生產(chǎn)的一款工業(yè)級ARM9處理器,內(nèi)嵌ARM920T ARM Thumb處理器核,主頻為180 MHz時性能可達200 MIPS,并內(nèi)置16 KB SRAM和128 KB ROM。外部總線接口(EBI)支持SDRAM等存儲器,帶有7個外部巾斷源,1個快速中斷源和4個32位PIO控制器,最多支持122個可編程I/O端口。同時該芯片還內(nèi)嵌Ethemet MAClO/100M接口,并提供USB 2.0全速主機端口與設(shè)備接口,以及其他常用的外部接口。
1.2 系統(tǒng)結(jié)構(gòu)設(shè)計
為了提高可靠性,本系統(tǒng)采用基于溫備的系統(tǒng)級可靠性設(shè)計方案。溫備是在熱備和冷備的基礎(chǔ)上發(fā)展起來的一種雙機容錯技術(shù),它是指兩臺機組同時加電,但只有主機處于工作狀態(tài),備機處于“溫態(tài)”(空轉(zhuǎn)等待接管主機工作的狀態(tài))。當主機發(fā)生故障時,由備機接替主機繼續(xù)工作。故障機修復(fù)完畢后成為新的備機。與熱備相比,溫備方案具有實現(xiàn)簡單、性能穩(wěn)定等優(yōu)點;相對于冷備方案,溫備方案中的備機能夠在主機故障后快速重啟系統(tǒng),從而最小化系統(tǒng)短時故障造成的損失。
系統(tǒng)具有兩個處理器模塊,每個處理器模塊都以AT9lRM9200作為計算核心,稱為“機組”。每臺機組可以單獨成為一個獨立的子系統(tǒng)完成各項任務(wù)。系統(tǒng)還具有一塊仲裁板,用于仲裁數(shù)據(jù)信號以及控制雙機的工作方式。系統(tǒng)結(jié)構(gòu)框圖如圖l所示。
利用AT91RM9200自帶的多種外設(shè)接口,每臺機組中除了具備處理器模塊之外,還帶有以太網(wǎng)接口、USB接口(用于連接USB接口無線網(wǎng)卡)和RS232串行接口。利用網(wǎng)絡(luò)通信的特有工作方式,每臺機組上的有線網(wǎng)絡(luò)接口連接到一個集線器,USB接幾無線網(wǎng)卡工作于managed模式,因此網(wǎng)絡(luò)接口信號不需要集中的仲裁輸入/輸出,系統(tǒng)只需仲裁板提供對串口輸入/輸出信號的仲裁。這種方式也為雙機之間傳遞同步信息提供一種有效途徑:運行于雙機中的應(yīng)用程序可以利用有線網(wǎng)絡(luò)或無線網(wǎng)絡(luò)傳遞同步信息,當主機發(fā)生故障后,備機中的用戶程序可以從最近的同步點開始工作,從而最小化主機故障造成的損失。
仲裁板上的控制邏輯通過兩臺機組的控制信號接口獲取各機組當前工作狀態(tài),從而判斷當前系統(tǒng)的工作模式,并據(jù)此控制機組與外部設(shè)備的連接??刂七壿嬤€負責向兩臺機組提供當前系統(tǒng)的工作狀況,以便為運行于機組中的應(yīng)用程序提供決策參考。
1.3 系統(tǒng)可靠性方案設(shè)計
為了提高整個系統(tǒng)的可靠性,須根據(jù)溫備的特點設(shè)計各種監(jiān)控機制。本系統(tǒng)針對每一臺機組均設(shè)有Watchdog電路用于監(jiān)控機組運行。一旦某臺機組發(fā)牛故障,經(jīng)過一定時間后,故障機相應(yīng)的Watchdog會檢測到故障的出現(xiàn),并通過向故障機組發(fā)送nReset信號復(fù)位故障機組,同時向另一臺機組發(fā)送IRQ信號以通知接管工作??刂七壿嫳3种鳈C與外部設(shè)備的連接,一旦主機發(fā)生故障,控制邏輯將更改工作狀態(tài),接通新主機與外部設(shè)備的連接。
在系統(tǒng)中,采用內(nèi)部和外部兩級監(jiān)控策略。內(nèi)部監(jiān)控方案利用AT91RM9200處理器內(nèi)部Watchdog模塊實現(xiàn);外部監(jiān)控方案則利用仲裁板中的EPlC6 FPGA和專用Watchdog芯片MAX6374實現(xiàn)。其中,MAX6374芯片是實現(xiàn)外部監(jiān)控功能的主體。當MAX6374損壞時,則采用位于EP1C6內(nèi)部利用硬件描述語言實現(xiàn)的Watchdog接管外部監(jiān)控工作,從而構(gòu)成冗余的外部監(jiān)控機制。內(nèi)部監(jiān)控機制的優(yōu)先級低于仲裁板上外部監(jiān)控機制的優(yōu)先級。如果仲裁板上的兩個Watchdog均發(fā)生失效,因而不能重啟CPU板時,AT9lRM9200的內(nèi)部Watchdog將會發(fā)生作用,重啟CPU。這是通過控制內(nèi)外兩種Watchdog計數(shù)時間的長短來實現(xiàn)的。將MAX6374的定時時間設(shè)置為3s,EPlC6的定時時間設(shè)置為4s,而AT9lRM9200內(nèi)部Watchdog定時時間設(shè)置為5 s。因此AT91RM9200內(nèi)部軟件Watchdog和仲裁板上的硬件Watchdog構(gòu)成了系統(tǒng)中的兩級監(jiān)控、一級冗余的監(jiān)控機制。系統(tǒng)的可靠性設(shè)計方案示意圖如圖2所示。
2 基于AT91RM9200的多級監(jiān)控機制的實現(xiàn)
2.1 利用MAX6374設(shè)計外部監(jiān)控器
在仲裁板上利用MAX6374芯片實現(xiàn)了專用的Watchdog電路。MAX6374足Maxim公司的一款低功耗Watchdog芯片,耗電儀5μA,封裝為8引腳SOT23。其定時周期可通過對引腳SET2、SETl和SETO進行編程,從而獲得不同的定時時間。MAX6374的定時周期如表1所列,電路原理圖如圖3所示。
MAX6374的輸入端WDI與AT91RM9200的PIO端口直接連接,而輸出端WD0則與AT91RM9200的nReset引腳相連。在實際使用中,將SETO、SETl和SET2分別設(shè)置為l、0和O。如果AT91RM9200在3 s內(nèi)沒有發(fā)出心跳信號,那么MAX6374將會在WDO端發(fā)出一個低電平脈沖,對AT91RM9200進行復(fù)位。此外,也可以通過FPGA對3個SET端口進行編程,以滿足不同定時間隔的需要。
2.2 利用EPlC6設(shè)計外部監(jiān)視器
除了使用MAX6374專用Watchdog電路之外,還可以利用FPGA設(shè)計另一個監(jiān)控模塊作為MAX6374電路的冗余。采用Altera公司的EPlC6 FPGA設(shè)計另一個外部Watchdog。AT91RM9200發(fā)出的心跳信號經(jīng)過機組上的控制信號接口輸入到EPlC6中,對EPlC6內(nèi)部自定義的Watchdog進行周期性的硬件復(fù)位;此外,EPlC6還負責仲裁兩臺機組各自的串口信號。具有Watchdog功能和仲裁功能的FPAG模塊稱為“仲裁器”。圖4是仲裁器的結(jié)構(gòu)功能圖。
圖4中各個關(guān)鍵信號說明如下:
(1)模塊符號
cpu0和cpul為雙機容錯系統(tǒng)中的兩臺機組符號;ARBITER為仲裁器的仲裁模塊,完成主機標志的判斷;DBOUT為仲裁器的數(shù)據(jù)通信模塊,將各數(shù)據(jù)信號仲裁后與外界進行通信;WDT0和WDT1為Watchdog模塊,分別監(jiān)視相應(yīng)的機組工作情況。
(2)輸入/輸出信號
wdiO和wdil為CPU發(fā)往各Watchdog的周期性心跳信號,用于標志CPU是否正常工作;IRQ0和IRQ1為中斷請求信號,請求啟動對應(yīng)的CPU機組接管故障機組;nRESET0和nRESETl為CPU的復(fù)位信號;clk為ARBITER模塊的同步信號。
外部Watchdog的主要Verilog代碼結(jié)構(gòu)如下:
可以看出,該模塊的計數(shù)時間由時鐘信號clk確定。本系統(tǒng)使用了40 MHz的時鐘晶振,因此如果需要長為4 s的定時時間,則為計數(shù)器設(shè)置的計數(shù)值應(yīng)當是40 000 000×4=160 000 000。經(jīng)過4 s之后,如果該Watthdog沒有收到處理器發(fā)來的心跳信號,則將通過FPGA的端口向AT9lRM9200的復(fù)位引腳發(fā)送低電平的復(fù)位信號。
wdi0和wdi1對仲裁器來說是異步輸入的信號。這樣很容易使得信號在FPGA中傳輸時,所需的時間不能精確估計,當兩個信號同時發(fā)生跳變的瞬間,就產(chǎn)生了“競爭與冒險”。這在時序仿真后的波形中往往就會產(chǎn)生一些不正確的尖峰毛刺信號。另外,由于FPGA以及其他CPLD器件內(nèi)部的分布電容和電感對電路中的毛刺基本沒有過濾作用,因此這些毛刺信號會被“保留”并傳遞到后一級,從而使得毛刺問題更加突出。為此在設(shè)計中增加了圖4中的clk信號作為全局的時鐘同步信號。它也是FPGA的時鐘信號,其作用是使由Watchdog發(fā)出的信號“同步”地輸入到仲裁器中,這樣可以消除毛刺信號。
clk同步化wd0和wdl的代碼如下:
2.3 利用內(nèi)部Watchdog模塊設(shè)計內(nèi)部監(jiān)控器
AT9lRM9200內(nèi)嵌Watchdog模塊,用于在軟件陷入死鎖時防止系統(tǒng)鎖定。其結(jié)構(gòu)基于一個16位遞減計數(shù)器,計數(shù)器值從AT91RM9200的寄存器ST_WDMR中載入,如圖5所示。
當Watchdog復(fù)位時,ST_WDMR的值為0x00020000,對應(yīng)于計數(shù)器的最大值;當Wathdog溢出時,在NWDOCF引腳上會出現(xiàn)一個寬度為8個慢時鐘周期的Watchdog溢出低電平信號。在典型慢時鐘頻率為32.768kHz的情況下,使用慢時鐘信號的128倍分頻信號可確定最大Watchdog周期為256 s。在正常操作下,Watchdog定時器溢出發(fā)生前,可以通過設(shè)置ST_CR(控制寄存器)的WDRST位,定期重載Watchdog值。
若出現(xiàn)溢出,Watchdog定時器將會:①設(shè)置中斷產(chǎn)生的ST_SR(狀態(tài)寄存器)的WDOVF位;②若ST_WD-MR中的EXTEN位置位,則在Watchdog溢出信號中產(chǎn)生一個8周期的慢時鐘低電平脈沖;③若ST_WDMR中RSTEN位置位,則會產(chǎn)生一個內(nèi)部中斷復(fù)位;④重載并重啟遞減計數(shù)器。
寫ST_WDMR不會重載或重啟遞減計數(shù)器,只有當對ST_CR寫入后,Watchdog計數(shù)器才立即由ST_WDMR中載入值并重啟。在使用AT91RM9200內(nèi)部Watchdog時,需要設(shè)定Watchdog工作方式,對AT91RM9200處理器進行內(nèi)部復(fù)位。具體的設(shè)置方式如下:
為了防止Watchdog溢出.需要周期性地置位寄存器ST_CR,從而完成對Watchdog計數(shù)值的復(fù)位。
在Atmel公司為AT91RM9200配置的ARM Linux操作系統(tǒng)中,已經(jīng)提供了AT91RM9200內(nèi)部Watchdog的使用接口。在配置好了內(nèi)部Watchdog的ARM Linux操作系統(tǒng)中,會創(chuàng)建/dev/misc/Watchdog設(shè)備文件,所有針對AT9lRM9200內(nèi)部Watchdog的操作均可以通過訪問該設(shè)備文件來完成。具體的操作方法如下:
(1)打開內(nèi)部Watchdog
使用該方法后,Watchdog會啟動并開始計數(shù)。如果在Watchdog的計數(shù)時間內(nèi)不對Watchdog復(fù)位,那么系統(tǒng)將會重新啟動。
(2)復(fù)位內(nèi)部Watchdog
Watchdog啟動后將會始終運行。如果因程序死鎖或其他原因?qū)е绿幚砥鞅罎ⅲ敲碬atchdog將無法復(fù)位成功,在Watchdog計數(shù)完畢之后將重啟AT91RM9200,使系統(tǒng)重新運行。這種方法為提高系統(tǒng)的可靠性,防止軟件死鎖,或者強電磁干擾導(dǎo)致的處理器失效提供了一種有效的保護手段。
2.4 AT91RM9200心跳信號的發(fā)送
系統(tǒng)中的兩個外部監(jiān)控電路均需要AT9l RM9200提供周期性的心跳信號,以便監(jiān)控系統(tǒng)的狀態(tài);同時AT91RM9200也要獲取外部監(jiān)控電路發(fā)送的中斷信號,然后更改系統(tǒng)中機組的運行狀態(tài)。以上功能均需要直接對機組中的AT91RM9200進行操作??梢酝ㄟ^對AT91RM9200的PIO端口進行周期性的電平置位/復(fù)位來實現(xiàn)心跳信號的發(fā)送。
AT91RM9200共有4組PIO控制器(即PIOA、PI-OB、PIOC和PIOD),每個PIO控制器分別控制32個PIO端口。每個PIO端口具備多種功能,如普通輸出、同步數(shù)據(jù)輸出、普通輸入、中斷源、外設(shè)選擇等。對于心跳信號的發(fā)送,需要將PIO端口設(shè)置為普通輸出功能,有關(guān)PIO的控制主要通過AT9lRM9200的GPIO控制器完成。在本設(shè)計中,將NCST/PCI3端口作為AT91RM9200心跳信號的發(fā)送端口,針對NCS7端口的輸出設(shè)置如下:
PIOC_OER|=0xD; /*使能NCS7的輸出功能*/
PIOC_PER|=0xD; /*設(shè)置NCS7端13為PIO控制器控制*/如果要將NCS7端口設(shè)置為高電平,則采用如下方法:
PIOC_SODR|=0xD; /*設(shè)置NCS7端口為高電平*/如果要將NCS7端口設(shè)置為低電平,則采用如下方法:
PIOC_CODR|=OXD;/*設(shè)置NCS7端口為低電平*/其中,PIOC_OER,PIOC_PER、PIOC_SODR和PIOC_CO-DR分別為PIOC控制器中的輸出使能寄存器、PIO使能寄存器、置位輸出數(shù)據(jù)寄存器和清零輸出數(shù)據(jù)寄存器。AT91RM9200心跳信號的發(fā)送由系統(tǒng)軟件中一個單獨的進程負責控制。
2.5 AT91RM9200中斷服務(wù)程序設(shè)計
當機組正常工作時,系統(tǒng)程序向仲裁板上的外部監(jiān)控模塊發(fā)送心跳信號,即信號WDI。外部監(jiān)控模塊通過兩臺機組發(fā)送的心跳信號判斷當前雙機容錯系統(tǒng)的工作狀態(tài)。如果經(jīng)過特定的時間后,仲裁板上的Watchdog模塊沒有收到某臺機組發(fā)送的心跳信號,則會向另一臺機組發(fā)送中斷信號,通知其采取相應(yīng)的操作。如果另一臺機組為備機,則備機上的系統(tǒng)程序?qū)S即啟動用戶程序;如果另一臺機組為主機,則主機不會進行任何操作,因為此時用戶程序已經(jīng)在主機中運行。發(fā)生故障的機組將會通過重新復(fù)位,嘗試故障的修復(fù)。在機組中運行的中斷服務(wù)程序負責接收外部Watchdog發(fā)送的中斷信號。針對AT91RM9200進行外部中斷處理可以有兩種方案。
(1)利用AT91RM9200的外部中斷源
由于AT91RM9200自帶7個普通外部中斷源和1個快速中斷源,因此可以直接將AT91RM9200的任意外部中斷引腳與系統(tǒng)的外部Watchdog的輸出中斷信號相連。
例如,如果要使用AT91RM9200的IRQ0引腳作為中斷源,則需在AT91RM9200的驅(qū)動程序中采用如下的方法進行設(shè)置:
request_irq函數(shù)是Linux操作系統(tǒng)中的中斷申請函數(shù)。該函數(shù)向操作系統(tǒng)申請中斷號為AT91C_ID_IRQO的中斷,并通知操作系統(tǒng)該中斷的中斷處理函數(shù)為at91_interrupt_IRQ0。隨后,定義at91_interrupt_IRQ0函數(shù):
這樣,一旦AT91RM9200的IRQO端口發(fā)生由高到低的電平跳變,則會引發(fā)at9l_interrupt_IRQO函數(shù)的執(zhí)行。
(2)利用AT9lRM9200的PIO端口作為中斷源
除了利用AT91RM9200自帶的外部中斷源之外,也可以利用AT9lRM9200提供的豐富的PIO端口作為中斷輸入。本系統(tǒng)中,使用AT9lRM9200的GPIOC7引腳作為中斷源,此時需要在AT91RM9200的驅(qū)動程序中采用如下方法進行設(shè)置:
request_irq(AT91C_ID_PIOC,at91_interrupt_PIOC,O,"at91Rm9200 interrupt PIOC",NULL);
該函數(shù)向操作系統(tǒng)申請了中斷號為AT91C_ID_IPIOC的中斷,并且通知操作系統(tǒng)該中斷的中斷處理函數(shù)為at91_interrupt_PIOC。為了使能PIOC控制器的中斷功能,還需要設(shè)置相應(yīng)的中斷控制寄存器:PIOC_IER|=0x7;
可以在中斷處理函數(shù)中添加啟動用戶程序的代碼,這樣,一旦AT9lRM9200接收到Watchdog發(fā)出的中斷信號之后,將會調(diào)用中斷處理程序從而啟動用戶的應(yīng)用程序。
結(jié)語
本文利用AT91RM9200處理器構(gòu)建了具有溫備功能的雙機容錯系統(tǒng)。該系統(tǒng)采用一級冗余、兩級監(jiān)控的高可靠設(shè)計方案,具有實現(xiàn)簡單、成本低等優(yōu)點,能夠滿足一般關(guān)鍵領(lǐng)域?qū)?strong>嵌入式系統(tǒng)的需求。經(jīng)實踐證明,該系統(tǒng)能夠應(yīng)對發(fā)生于板級和處理器級的故障,延長了系統(tǒng)的平均故障間隔時間,應(yīng)用效果較好。