<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 用AT91 RM9200構(gòu)建高可靠嵌入式系統(tǒng)

          用AT91 RM9200構(gòu)建高可靠嵌入式系統(tǒng)

          作者: 時間:2008-01-21 來源:網(wǎng)絡(luò) 收藏
          摘要 提出一種基于處理器的高雙機溫備解決方案。利用EPlC6、MAX6374設(shè)計兩個冗余的外部Watchdog監(jiān)控處理器的工作狀態(tài),利用自帶的Watchdog作為內(nèi)部監(jiān)測機制監(jiān)控處理器本身的故障;設(shè)計并給出了以為核心的監(jiān)控機制的具體實現(xiàn),包括心跳信號的發(fā)送和中斷服務(wù)程序的設(shè)計。
          關(guān)鍵詞 AT91RM9200 Watchdog雙機客錯 溫備 高


          本文設(shè)計了一種以AT91RM9200處理器為核心的高系統(tǒng)。系統(tǒng)具有兩臺機組,當(dāng)一臺機組發(fā)生故障后,另一臺機組接管工作并繼續(xù)運行。系統(tǒng)提供外部和內(nèi)部Watchdog(看門狗)監(jiān)控機制構(gòu)成一級冗余、兩級監(jiān)控的可靠性設(shè)計方案。其中外部Watchdog分別采用MAX6374和以EPlC6 FPGA的監(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時性能可達(dá)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))。當(dāng)主機發(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ò)傳遞同步信息,當(dāng)主機發(fā)生故障后,備機中的用戶程序可以從最近的同步點開始工作,從而最小化主機故障造成的損失。
          仲裁板上的控制邏輯通過兩臺機組的控制信號接口獲取各機組當(dāng)前工作狀態(tài),從而判斷當(dāng)前系統(tǒng)的工作模式,并據(jù)此控制機組與外部設(shè)備的連接。控制邏輯還負(fù)責(zé)向兩臺機組提供當(dāng)前系統(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)控功能的主體。當(dāng)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進(jìn)行編程,從而獲得不同的定時時間。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進(jìn)行復(fù)位。此外,也可以通過FPGA對3個SET端口進(jìn)行編程,以滿足不同定時間隔的需要。
          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進(jìn)行周期性的硬件復(fù)位;此外,EPlC6還負(fù)責(zé)仲裁兩臺機組各自的串口信號。具有Watchdog功能和仲裁功能的FPAG模塊稱為“仲裁器”。圖4是仲裁器的結(jié)構(gòu)功能圖。
          圖4中各個關(guān)鍵信號說明如下:

          (1)模塊符號
          cpu0和cpul為雙機容錯系統(tǒng)中的兩臺機組符號;ARBITER為仲裁器的仲裁模塊,完成主機標(biāo)志的判斷;DBOUT為仲裁器的數(shù)據(jù)通信模塊,將各數(shù)據(jù)信號仲裁后與外界進(jìn)行通信;WDT0和WDT1為Watchdog模塊,分別監(jiān)視相應(yīng)的機組工作情況。
          (2)輸入/輸出信號
          wdiO和wdil為CPU發(fā)往各Watchdog的周期性心跳信號,用于標(biāo)志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)當(dāng)是40 000 0004=160 000 000。經(jīng)過4 s之后,如果該Watthdog沒有收到處理器發(fā)來的心跳信號,則將通過FPGA的端口向AT9lRM9200的復(fù)位引腳發(fā)送低電平的復(fù)位信號。
          wdi0和wdi1對仲裁器來說是異步輸入的信號。這樣很容易使得信號在FPGA中傳輸時,所需的時間不能精確估計,當(dāng)兩個信號同時發(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所示。

          當(dāng)Watchdog復(fù)位時,ST_WDMR的值為0x00020000,對應(yīng)于計數(shù)器的最大值;當(dāng)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ù)器,只有當(dāng)對ST_CR寫入后,Watchdog計數(shù)器才立即由ST_WDMR中載入值并重啟。在使用AT91RM9200內(nèi)部Watchdog時,需要設(shè)定Watchdog工作方式,對AT91RM9200處理器進(jìn)行內(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ū)е绿幚砥鞅罎?,那么Watchdog將無法復(fù)位成功,在Watchdog計數(shù)完畢之后將重啟AT91RM9200,使系統(tǒng)重新運行。這種方法為提高系統(tǒng)的可靠性,防止軟件死鎖,或者強電磁干擾導(dǎo)致的處理器失效提供了一種有效的保護(hù)手段。
          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進(jìn)行操作??梢酝ㄟ^對AT91RM9200的PIO端口進(jìn)行周期性的電平置位/復(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)軟件中一個單獨的進(jìn)程負(fù)責(zé)控制。
          2.5 AT91RM9200中斷服務(wù)程序設(shè)計
          當(dāng)機組正常工作時,系統(tǒng)程序向仲裁板上的外部監(jiān)控模塊發(fā)送心跳信號,即信號WDI。外部監(jiān)控模塊通過兩臺機組發(fā)送的心跳信號判斷當(dāng)前雙機容錯系統(tǒng)的工作狀態(tài)。如果經(jīng)過特定的時間后,仲裁板上的Watchdog模塊沒有收到某臺機組發(fā)送的心跳信號,則會向另一臺機組發(fā)送中斷信號,通知其采取相應(yīng)的操作。如果另一臺機組為備機,則備機上的系統(tǒng)程序?qū)S即啟動用戶程序;如果另一臺機組為主機,則主機不會進(jìn)行任何操作,因為此時用戶程序已經(jīng)在主機中運行。發(fā)生故障的機組將會通過重新復(fù)位,嘗試故障的修復(fù)。在機組中運行的中斷服務(wù)程序負(fù)責(zé)接收外部Watchdog發(fā)送的中斷信號。針對AT91RM9200進(jìn)行外部中斷處理可以有兩種方案。
          (1)利用AT91RM9200的外部中斷源
          由于AT91RM9200自帶7個普通外部中斷源和1個快速中斷源,因此可以直接將AT91RM9200的任意外部中斷引腳與系統(tǒng)的外部Watchdog的輸出中斷信號相連。
          例如,如果要使用AT91RM9200的IRQ0引腳作為中斷源,則需在AT91RM9200的驅(qū)動程序中采用如下的方法進(jìn)行設(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ū)動程序中采用如下方法進(jìn)行設(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處理器了具有溫備功能的雙機容錯系統(tǒng)。該系統(tǒng)采用一級冗余、兩級監(jiān)控的高可靠設(shè)計方案,具有實現(xiàn)簡單、成本低等優(yōu)點,能夠滿足一般關(guān)鍵領(lǐng)域?qū)?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/嵌入式">嵌入式系統(tǒng)的需求。經(jīng)實踐證明,該系統(tǒng)能夠應(yīng)對發(fā)生于板級和處理器級的故障,延長了系統(tǒng)的平均故障間隔時間,應(yīng)用效果較好。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();