siemens x
I/O 設(shè)備

基于嵌入式實(shí)時(shí)操作系統(tǒng)的現(xiàn)場(chǎng)總線網(wǎng)關(guān)的設(shè)計(jì)

2025China.cn   2009年11月30日

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



    網(wǎng)關(guān)的設(shè)計(jì)過(guò)程中,自上而下分為三層:應(yīng)用/任務(wù)層、操作系統(tǒng)層和硬件層。分層結(jié)構(gòu)如圖2所示。




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



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




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

(轉(zhuǎn)載)

標(biāo)簽:現(xiàn)場(chǎng)總線 我要反饋 
2024世界人工智能大會(huì)專題
即刻點(diǎn)擊并下載ABB資料,好禮贏不停~
優(yōu)傲機(jī)器人下載中心
西克
2024全景工博會(huì)
專題報(bào)道