提出一種基于AT91RM9200處理器的高可靠雙機溫備解決方案。利用EPlC6、MAX6374設計兩個冗余的外部Watchdog監控處理器系統的工作狀態,利用AT91RM9200自帶的Watchdog作為內部監測機制監控處理器本身的故障;設計并給出了以AT91RM9200為核心的監控機制的具體實現,包括心跳信號的發送和中斷服務程序的設計。 本文設計了一種以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處理器構建了具有溫備功能的雙機容錯系統。該系統采用一級冗余、兩級監控的高可靠設計方案,具有實現簡單、成本低等優點,能夠滿足一般關鍵領域對嵌入式系統的需求。經實踐證明,該系統能夠應對發生于板級和處理器級的故障,延長了系統的平均故障間隔時間,應用效果較好。 |