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