顶级欧美丰满熟妇XXXXX视频,中文字幕亚洲精品乱码,久久黑国产,中文字幕一区二区三区日韩精品 ,色九月亚洲综合网

I/O 設備

基于嵌入式實時操作系統的現場總線網關的設計

ainet.cn   2009年11月30日

一、引言
        隨著現場總線技術的不斷發(fā)展,諸如計算機技術、通信技術等不斷地引入到自動控制領域,大大地促進了新一代控制系統——現場總線控制系統(FCS)的發(fā)展。
    隨著嵌入式系統與網絡的日益結合,在嵌入式實時操作系統(RTOS)中引入TCP/IP協議棧,以支持嵌入式設備接入網絡,成為嵌入式領域重要的研究方向。
       本文將介紹基于嵌入式實時操作系統的現場總線網關的設計。其中所介紹的現場總線是WorldFIP現場總線;實時操作系統(RTOS)是μC/OS-Ⅱ。
二、WorldFIP現場總線和μC/OS-Ⅱ簡介
    IP現場總線簡介
   WorldFIP FCS是一種用于自動化系統的現場總統提供現場設備和控制器以及控制器之間的數字化連接。WorldFIP FCS適合各種應用結構:集中、分散和主從;其開放性使不同制造廠家的設備能夠互操作。WorldFIP除了具備現場總線的一般特點,如數字化,標準化,節(jié)省布線,安裝方便,維護性好,互換性和互操作性等,還具有很多獨到之處,如協議單一、抗干擾能力強、帶調度的總線訪問控制等。
    2.實時操作系統μC/OS-Ⅱ簡介
       嵌入式實時操作系統μC/OS-Ⅱ是基于優(yōu)先級的搶占式實時多任務操作系統,其內核可以簡單地看做是一個多任務的調度器,在這個任務調度器之上完善并添加了和實時多任務操作系統相關的一些系統服務,如任務管理、時間管理、信號量、郵箱等。它的90%的代碼都是用C語言編寫的,因此μC/OS-Ⅱ具有良好的可移植性。移植工作的絕大部分都集中在多任務切換的實現上,由于這部分代碼主要是用來保存和恢復處理器現場(即相關寄存器),與處理器硬件相關,因此只能使用特定的處理器匯編語言完成。在本文嵌入式網關的開發(fā)過程中,以開源TCP/IP協議棧LwIP為基礎,實現了μC/OS-Ⅱ的網絡支持功能。LwIP實現了 TCP/IP的主要協議如TCP、UDP、ICMP、IP、ARP,其優(yōu)點是在保持TCP協議主要功能的基礎上減少對資源的占用,使得LwIP協議棧非常適合在低端嵌入式系統中使用。
三、嵌入式網關的設計
       本設計所設計的嵌入式網關的主要功能是實現WorldFIP現場總線和Internet之間的相互通信時的協議轉換,從而實現工業(yè)控制中管理層和現場控制層之間的無縫結合,使得WorldFIP現場總線成為一個真正開放的工業(yè)控制網絡。控制系統模型如圖1所示。



    網關的設計過程中,自上而下分為三層:應用/任務層、操作系統層和硬件層。分層結構如圖2所示。




    (一)硬件層設計
       硬件層設計主要包括選擇合適的芯片及進行原理設計。在本設計中,選用Samsung公司的ARM 32bits芯片s3c451Ob微處理器,它的運行速率為5OMHz,帶有Ethernet控制器;網卡芯片使用ICS1890;WorldFIP側選用的芯片是符合WorldFIP現場總線協議的專用芯片(Fullfip2、FIPDUAL等);CPLD選用ALTERA公司的EPM7128SLC84,主要用于s3c4510b和Fullfip2之間的時序匹配和邏輯組合;SDRAM選用Hynix的HY57v64323220,主要用于任務堆棧和中間變量;flash選用SST的39VF169,主要用于存放程序;SRAM選用ISSI的IC61C1024,主要用于存放Fullfip2的微碼和中間變量。硬件結構如圖3所示。



    (二)操作系統層設計
       操作系統層設計的主要內容是在系統硬件平臺上構建一個工作平臺,在這個平臺上建立應用程序、創(chuàng)建任務等。操作系統層設計主要包括三部分:
    (1) 嵌入式實時操作系統μC/OS-Ⅱ的移植;
    (2) TCP/IP協議棧LwIP的移植;
    (3)網絡設備驅動程序。
    協議棧的移植
    為了使WorldFIP現場總線可以和Internet通信,在設計中必須把TCP/IP協議棧移植到μC/OS-Ⅱ操作系統中(μC/OS-Ⅱ移植將在后面介紹)。為了節(jié)省對系統資源的占用,設計中選用了開源的嵌入式TCP/IP協議?!狶wIP。LwIP協議棧是一個輕量的TCP/IP協議棧,一般只需要幾十千字節(jié)的RAM和40K左右的ROM就可以運行,這使LwIP協議棧適合在低端嵌入式系統中使用。LwIP的源碼可以到相關的網站上下載,目前的版本是0.6.3。LwIP的特性如下:  
    (1)支持多網絡接口下的IP轉發(fā);
    (2)提供專門的內部回調接口(Raw API)用于提高應用程序性能;
    (3)可選擇的Berkeley接API。
   為了方便移植,LwIP協議棧把所有與硬件、OS、編譯器相關的部分單獨放在/src/arch目錄下,因此移植時只需修改這個目錄下的文件即可,其他源文件一般不需要修改。在移植的過程中,最主要的是和OS相關的一些函數和結構,這些函數和結構在arch目錄下的sys_arch.h和sys_arch.c中定義和實現。主要有:
    (l)sys_arch_timeout函數。
    這個函數描述的是LwIP中與外界網絡連接的線程等待超時timeout屬性,該屬性與OS相關。每個線程的timeout屬性對應著一個在sys.h中定義的結構體sys_timeout,我們所要實現的是如下函數:
    struct sys_timeouts * sys_arch_timeouts(void)
    該函數的功能是返回目前正處于運行態(tài)的線程所對應的timeout隊列指針。
    (2)sys_sem_t信號量。
    在LwIP中用信號量來實現同步,因此需要在sys_arch中實現sys_sem_t結構體和處理函數:  
    typedef OS_EVENT * sys_sem_t;
    sys_sem_t sys_sem_new (lNT8U count);
    void sys_sem_signal (sys_sem_t sem);
    INTl6U sys_arch_sem_wait (sys_sem_t sem,INTl6U timeout);
    void sys_sem_free (sys_sem_t sem);
    μC/OS-Ⅱ已經實現了信號量的各種操作,而且功能和LwIP中的幾個函數完全一樣的,所以在LwIP中只需把μC/OS-Ⅱ中的函數封裝打包。
    (3) sys_mbox_t消息。
    在LwIP中實現緩沖、數據傳遞要用到消息隊列,所以在sys_arch中實現sys_mbox_t結構體和處理函數:
    typedef struct
    {
    OS_EVENT * pQ;
    void * pvQEntries [MAX  _  QUEUE  _  EN_ TRIES];
    }  sys_mbox_t;
    sys_mbox_t;
    sys_mbox_t sys_mbox_new (void);
    void sys_mbox_post(sys_mbox_t mbox,void * msg);
    INT16U sys_arch_mbox_fetch (sys_mbox_tmbox,void * * msg,INT16U timeout);
    void sys_mbox_free (sys_mbox_t mbox);
    在μC/OS-Ⅱ中同樣實現了消息隊列結構OSQ及其相應操作函數,但在μC/OS-Ⅱ并沒有對消息隊列中的消息進行管理,因此不能直接使用,所以sys_mbox_t結構定義如上面所述。對隊列本身的管理利用μC/OS-Ⅱ的OSQ操作完成;對消息的創(chuàng)建、使用、刪除回收使用μC/OS-Ⅱ中的內存管理模塊實現,兩部分綜合起來形成了LwIP的消息隊列功能。
    2.網絡設備驅動程序
    驅動程序主要包括:
    (1) 初始化CPU芯片s3c4510b的ethernet controller的寄存器和PHY芯片ICS1890的控制寄存器;
    (2) 中斷處理函數;
    (3) 接收數據包和發(fā)送數據包處理函數。
四、μC/OS-Ⅱ在s3c4510b上的移值
      μC/OS-Ⅱ是一個開源的RTOS,其主要工作流程如圖4所示。任務切換的核心是利用出棧指令將每個任務的工作現場恢復,并且調整PC指針來完成任務的切換。μC/OS-Ⅱ移值的關鍵就是如何構造任務堆棧及切換任務時的出棧順序。在這個流程圖中我們可以看到在移值過程中需編寫的幾個子程序的位置。
     由圖4的工作流程可以看出要實現μC/OS-Ⅱ的移值,必須對系統源碼做必要的修改,主要集中在以下三個文件中。




   (一) OS CPU.H文件
      OS_CPU.H中包括了用#define定義的與處理器相關的常量、宏、數據類型、堆棧單位和堆棧增長方向。 
   1.數據類型定義
   不同的處理器有不同的字長,而且數據字長和所用的編譯器也有關系,因此在移植中要定義一些數據類型。在本網關的設計中所用的編譯器是開源的GNU下的arm-elf-gCC,用戶需要做的就是查看所用的編譯器手冊,確定對應于μC/OS-Ⅱ的標準C數據類型。
   2.堆棧單位及增長方向
   任務堆棧的數據類型必須和CPU的寄存器長度一致,通過為OS_STK聲明正確的數據類型來完成的,在本設計中的聲明如下:
   typedef unsigned int OS_STK;
     / * Each stack entrY is 32_bit wide */
   堆棧的增長用OS_STK_GROWTH來設置,OS_STK_GROWTH為O表示堆棧從下向上增長,為1表示堆棧從上向下增長,在本設計中的定義如下:
     #define OS_STK_GROWTH        l
   3.宏定義
   宏定義包括開關中斷及任務切換的宏定義:
   #define OS_ENTER_CRITICAL(  )ARMDis-ableInt(    )
   #define OS_EXIT_CRITICAL(    )ARMEna-bleInt(    )
   #define OS_TASK_SW(    )OSCtXSw(    )
   (二)OS_CPU_C.C
   OS_CPU_C.C主要包括任務堆棧的初始化,及系統鉤子函數的定義。在這個文件中包括以下6個函數:
    OSTaskStkInit(    )
    OSSTaskCreateHook(     )
    OSTaskDelHook(    )
    OSTaskSwHook(    )
    OSTaskStatHook(    )
    OSTimeTickHook(    )
    其中5個HOOK函數如果沒有特殊要求,只需聲明為空函數,必須修改的是OSTaskStkInit (  )。 OSTaskStkInit(   )的實現如下:
    void * OSTaskStkInit (void (* task)  (void * pd),void * pdata,void * ptos,INTl6Uopt)
    {    
    unsigned  int * stk;
    opt=opt;
    stk= (unsigned int * ) Ptos;
    *--stk= (unsigned int) task;
 *- -stk=0;
    *--stk=0,
    *--stk=0,
    *--stk=0,
    *--stk=0;
    *--stk=0;
    *--stk=0;
 *--stk=0;
    *--stk=0;
    *--stk=0;
    *--stk=0;
    *--stk=0;
    *--stk=0 (unsigned int) Pdata;
    *--stk= (SVCMODE | OxO);
    *--stk= (SVCMODE | OxO);
    return( (void*) stk);
    在 OSTaskCreate(     )或 OSTaskCreateEXt(    )中調用該函數來初始化任務的堆棧,返回堆棧指針STK。
    (三)OS_CPU_A.S
    μC/OS-Ⅱ的移植工作的重點和難點主要體現在O_CPU_A.S文件的實現上,主要編寫下面四個匯編語言函數:
    OSStanHighRdy(    )
    OSCtxSw(    )
    OSIntCtxSw(    )
    OSTickISR(    )
      其中最困難的工作又集申在OSIntCtxSw(  )和OSTickISR(    )兩個函數,因為這兩個函數不僅和相關硬件定時器、中斷積存器的設置有關,而且集中體現了移植的思路。下面分別介紹(具體代碼限于篇幅不詳細列出)。
    tHighRdy(    )
      此函數只在多任務啟動時由OSStart(  )函數調用一次,功能是從最高優(yōu)先級任務的TCB中得到該任務的堆棧指針sp,并用該指針恢復CPU現場,使得最高優(yōu)先級任務處于就緒狀態(tài)。
    w(    )
      該函數實現了任務級的任務切換,流程如圖4所示。任務級的任務切換是通過發(fā)軟中斷指令來完成的,軟中斷矢量指向該函數。在μC/OS-Ⅱ系統中,如果一個任務調用了某個函數而使得更高優(yōu)先級任務進入了就緒狀態(tài),系統就會通過發(fā)SWI來找到OSCtxSw(  );在該任務的最后,系統會調用OSShed(  )將最高優(yōu)先級任務的地址加載到OSTCBHighRdy中,再調用OS_TASK_SW( )來執(zhí)行軟中斷調用OSCtxSw( )進行任務切換。
    3.0SIntCtxSw(    )
      該函數實現了中斷級任務切換,流程如圖4(b)所示。在ISR中,可能會引起任務的切換,如果需要進行任務切換,則在ISR的最后通過0S_IntEXit(   )調用OSIntCtxSw(   )實現中斷級任務切換。此函數和OSCtxSw(  )函數類似,不同的是該函數進行的是中斷級任務切換,在系統進入中斷時,CPU現場己被保存過了,因此在該函數中不再進行CPU現場保護,只需對堆棧指針做相應的調整即可。
    ISR(   )
      該函數用來實現定時器時鐘中斷處理,但在本系統的設計過程中,把定時器中斷設為IRQ中斷模式,并且IRQ中斷包括好多中斷源。因引,把該函數作為IRQ中斷的ISR,再根據中斷號來調用具體的各個中斷服務程序(如定時器中斷、MAC中斷等)。
    另外,在系統的啟動文件中,需要建立每種異常的異常向量表,并強制ARM處理器狀態(tài)位svc管理模式。
五、總 結
      本設計在s3c451Ob的硬件平臺上成功移植了μC/OS-Ⅱ,并且移植了嵌入式TCP/IP協議棧LwIP,實現了WorldFIP現場總線和Internet之間的相互通信,使得WorldFIP現場總線成為真正開放的工業(yè)現場總線。在網關的整體設計中,由于系統比較大,任務數較多,用實時內核來管理調度這些任務,要消耗較多的CPU使用率和系統的內存,具有一定的局限性,但在CPU足夠快,內存足夠大的情況下,使用嵌入式網關設計,在保證了工業(yè)現場總線的實時性和可靠性的基礎上,更有利于系統的集成度和再次開發(fā)。

(轉載)

標簽:現場總線 我要反饋 
泰科電子ECK、ECP系列高壓直流接觸器白皮書下載
億萬克
專題報道