1. gzyueqian
      18529173453

      嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS- II在真空爐控制系統(tǒng)中的應(yīng)用

      更新時(shí)間: 2007-06-25 10:12:09來(lái)源: 粵嵌教育瀏覽量:1164

        真空爐控制系統(tǒng)具有數(shù)據(jù)采集、處理、動(dòng)作實(shí)施、監(jiān)控、保護(hù)和網(wǎng)絡(luò)通信等功能。在正常工作時(shí),負(fù)責(zé)采集真空爐的運(yùn)行參數(shù),例如溫度、真空度、加熱元件的電壓、電流等相關(guān)參數(shù)。并對(duì)數(shù)據(jù)進(jìn)行處理,把處理結(jié)果與給定的工藝設(shè)置進(jìn)行比較后,發(fā)出相關(guān)執(zhí)行命令,在系統(tǒng)發(fā)生故障時(shí),控制系統(tǒng)還提供檢測(cè)、記錄、保護(hù)等功能。

        該基于ARM的工業(yè)嵌入式系統(tǒng)價(jià)格便宜,功能強(qiáng)大,維護(hù)操作簡(jiǎn)單,運(yùn)行穩(wěn)定,安全可靠。軟件部分工作,主要包括μC/OS-II的移植以及應(yīng)用軟件的編寫。

        μC/OS-II的移植

        移植μc/OS-II的主要工作是處理器和編譯器相關(guān)代碼及BSP的編寫。

        前提條件

        移植μC/OS-II的微處理器必須滿足以下要求:

        (1) 處理器的c編譯器支持可重人函數(shù);
        (2) 程序中打開(kāi)和關(guān)閉中斷;
        (3) 處理器支持中斷,并且能產(chǎn)生定時(shí)器中斷(uC/OS-II是通過(guò)定時(shí)器中斷來(lái)實(shí)現(xiàn)多任務(wù)的調(diào)度,即時(shí)間片的產(chǎn)生);
        (4) 處理器要具有一定的硬件堆棧數(shù)量。
        (5) 處理器要有將堆棧指針和其他CPU寄存器存儲(chǔ)和讀出堆棧(或者內(nèi)存)的指令。

        在此次系統(tǒng)改造中,使用的Atmel工業(yè)級(jí)處理器AT91RM9200(ARM920T)完全滿足以上條件。

        BSP設(shè)計(jì)

        UCOS肩動(dòng)中,系統(tǒng)在完成初的硬件初始化以后便轉(zhuǎn)入由開(kāi)發(fā)者提供的main(),在main()中再調(diào)用一個(gè)內(nèi)核函數(shù)OSInit()來(lái)完成內(nèi)核的初始化,然后在完成了與應(yīng)用相關(guān)的初始化以后,就可以調(diào)用一個(gè)內(nèi)核函數(shù)OSStart()啟動(dòng)內(nèi)核的進(jìn)程調(diào)度。從上面的過(guò)程看出,main()函數(shù)其實(shí)是一個(gè)回調(diào)函數(shù),整個(gè)系統(tǒng)的人口是建立在特定CPU(匯編語(yǔ)言編寫的底層函數(shù)和數(shù)據(jù)結(jié)構(gòu))硬件初始化環(huán)境的程序中。

        UCOS內(nèi)核引導(dǎo)裝入程序與硬件初始化程序連接,或者說(shuō)在其上構(gòu)建內(nèi)核引導(dǎo)裝入程序。

        引導(dǎo)程序針對(duì)具體的微處理器及其配置,完成系統(tǒng)內(nèi)存映射、中斷向量初始化、系統(tǒng)堆棧空間的分配和C語(yǔ)言變量初始化。,通過(guò)跳轉(zhuǎn)指令轉(zhuǎn)向C語(yǔ)言主程序main,在主程序中CPU的控制權(quán)交給操作系統(tǒng)。其中,內(nèi)存映射是對(duì)系統(tǒng)所使用的外部存儲(chǔ)器以及內(nèi)部使用的所有功能模塊的初始化,以便程序能正確地操作。中斷向量的初始化是將中斷處理程序存儲(chǔ)在相應(yīng)的中斷向量位置。系統(tǒng)堆棧空間的分配主要是對(duì)處理器的7種工作模式分別設(shè)置棧底和堆棧大小,這保證多任務(wù)切換或者異常中斷時(shí),當(dāng)前CPU的運(yùn)行狀態(tài)被保存,從而保證系統(tǒng)正常運(yùn)行。

        主要包括如下步驟:標(biāo)志整個(gè)代碼的初始人口點(diǎn);設(shè)置異常中斷向量表;初始化存儲(chǔ)系統(tǒng);初始化MMU;將已經(jīng)初始化的數(shù)據(jù)搬運(yùn)到可寫的數(shù)據(jù)區(qū);初始化各個(gè)模式下的數(shù)據(jù)棧;初始化一些特殊外圍接口;中斷處理程序;使能IRQ異常中斷等。以上的步驟中根據(jù)處理器中相應(yīng)的寄存器,進(jìn)行數(shù)據(jù)的讀寫即可。

        μC/OS-II移植

        雖然μC/OS-II的大部分代碼是用C語(yǔ)言編寫,但還存在了一些與處理器相關(guān)的匯編語(yǔ)言代碼,從而實(shí)現(xiàn)對(duì)處理器寄存器的訪問(wèn)以及堆棧的操作。μC/OS-II的體系結(jié)構(gòu)如圖1所示,可以看出μC/OS-II操作系統(tǒng)的移植主要是改寫如下3個(gè)文件:

        C語(yǔ)言頭文件,OS_CPU.H
        C語(yǔ)言源文件,OS_CPU_C.C
        匯編源文件程序,OS_CPU_A.ASM

        OS_CPU.H

        OS_CPU.H包括一系列用#define定義的與處理器相關(guān)的數(shù)據(jù)類型、宏和常量,如關(guān)中斷、開(kāi)中斷、任務(wù)切換和堆棧增長(zhǎng)方式等。

        (1) 數(shù)據(jù)類型定義

        數(shù)據(jù)類型的修改與所用的編譯器相關(guān),不同的編譯器使用不同的字節(jié)長(zhǎng)度表示同一數(shù)據(jù)類型。在系統(tǒng)中定義整型數(shù)據(jù)結(jié)構(gòu)為32位的整數(shù)。

        (2) 堆棧單位及增長(zhǎng)方向

        在任務(wù)切換時(shí),CPU現(xiàn)場(chǎng)的寄存器將保存在當(dāng)前運(yùn)行任務(wù)的堆棧中,所以O(shè)S_STK數(shù)據(jù)類型應(yīng)與CPU的寄存器長(zhǎng)度一致。

        AT91RM9200堆棧由高地址向低地址增長(zhǎng)。在函數(shù)調(diào)用時(shí),人口參數(shù)和返回地址一般保存在當(dāng)前任務(wù)的堆棧中,編譯器的編譯選項(xiàng)和由此生成的堆棧指令就會(huì)決定堆棧的增長(zhǎng)方向。置Os_stk_growth為0,表示堆棧從下(低地址)往上遞增。

        (3) 宏定義

        包括開(kāi)關(guān)中斷的宏定義,以及進(jìn)行任務(wù)切換的宏定義。

        μc/OS-II在處理臨界代碼時(shí)要先關(guān)中斷,處置完后再打開(kāi),這樣可保護(hù)臨界代碼不被多任務(wù)和中斷服務(wù)子程序破壞,處理器提供匯編指令os_enter_critical()、os_exit_critical()來(lái)開(kāi)關(guān)中斷。通過(guò)對(duì)os_critical_method賦值來(lái)選擇方式。

        Os_task_sw()是從低優(yōu)先級(jí)任務(wù)切換到高優(yōu)先級(jí)任務(wù)時(shí)須用到的一個(gè)宏。Os_task_sw()總是在任務(wù)級(jí)代碼中被調(diào)用。

        OS_GPU_C.C

        OS_CPU_C.C中包括一系列C語(yǔ)言函數(shù):OSTaskStkInit()和若干個(gè)Hook函數(shù)。必要的是OSTaskStkInit(),其他9個(gè)只須聲明,并不一定包含任何代碼。

        實(shí)現(xiàn)任務(wù)初始化時(shí)的堆棧設(shè)計(jì)。在ARM體系結(jié)構(gòu)下,任務(wù)堆棧空間由高至低依次保存著pc、lr等寄存器。一方面,當(dāng)前任務(wù)堆棧初始化完成后,OSTaskStkInit返回新的堆棧指針STK,OSTaskCreate()執(zhí)行時(shí),將會(huì)調(diào)用OSTaskStkInit的初始化過(guò)程,然后通過(guò)OSTCBInit()函數(shù)調(diào)用,將返回的SP指針保存到該任務(wù)的TCB塊中;其次,初始狀態(tài)的堆棧是模擬了一次中斷后的堆棧結(jié)構(gòu),因?yàn)槿蝿?wù)創(chuàng)建后并不是直接就獲得執(zhí)行,而是通過(guò)OSSched()函數(shù)進(jìn)行調(diào)度分配,滿足執(zhí)行條件后才能獲得執(zhí)行。為使調(diào)度簡(jiǎn)單一致,預(yù)先將該任務(wù)的PC指針和返回地址LR都指向函數(shù)人口,以便被調(diào)度時(shí)從堆棧中恢復(fù)剛開(kāi)始運(yùn)行時(shí)的CPU現(xiàn)場(chǎng)。

        OSTaskstkInit()在創(chuàng)建任務(wù)時(shí)被OSTaskCreate()或OSTaskCreateExt()調(diào)用來(lái)初始化任務(wù)的堆棧結(jié)構(gòu)。表1顯示了在AT91RM9200中需要放到任務(wù)堆棧中的寄存器及其順序。

       

        OSTaskStkInit()的代碼如下,4個(gè)參數(shù)中,task是任務(wù)的起始地址,pdata是傳給任務(wù)的數(shù)據(jù)指針,ptos是初的SP,opt沒(méi)有用到。函數(shù)返回的是全部人棧操作完成后的新的SP。


        OS_CPU_C.ASM

        OS_CPU_A.ASM中包括4個(gè)匯編語(yǔ)言函數(shù):OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。

        Osstart()調(diào)用OSStartHighRdy()函數(shù)使就緒態(tài)任務(wù)中優(yōu)先級(jí)的任務(wù)開(kāi)始運(yùn)行。任務(wù)級(jí)的切換是通過(guò)執(zhí)行軟中斷指令,或依據(jù)處理器的不同,執(zhí)行陷阱指令實(shí)現(xiàn)。中斷服務(wù)子程序、陷阱或異常處理的向量地址必須指向OSCtxSw()。

        OSIntCtxSw0實(shí)現(xiàn)中斷級(jí)的任務(wù)切換,在ISR中被調(diào)用的,由于所有的CPU寄存器都已經(jīng)被ISR正確地保存到了被中斷任務(wù)的堆棧之中,并且如果該ISR是中斷嵌套的層,則ISR已經(jīng)將SP保存到被中斷任務(wù)的任務(wù)控制塊(TCB)中了。因此除了不需要再保存CPU寄存器和堆棧指針外,OSIntCtxSw()完全可以采用OSCtxSw()中的大部分代碼,實(shí)際上本系統(tǒng)中的中斷級(jí)切換就是直接跳轉(zhuǎn)到OSCtxSw()中的標(biāo)號(hào)為_(kāi)OSIntCtxSw的那一行的。

        μC/OS-II要求用戶提供一個(gè)周期性的時(shí)鐘源實(shí)現(xiàn)時(shí)間的延遲和超時(shí)功能,可以使用硬件定時(shí)器,也可以從交流電中獲得50/60Hz的時(shí)鐘頻率。Osintexit()通過(guò)調(diào)用osintctxsw ()函數(shù)在ISR中執(zhí)行任務(wù)切換功能。

        OSTickISR()的主要任務(wù)就是調(diào)用函數(shù)OSTimeTick(),其作用是給每個(gè)需要延時(shí)的任務(wù)的延時(shí)時(shí)間OSTCBDly減1(如果該項(xiàng)不為零的話)。當(dāng)某個(gè)任務(wù)的OSTCBDly減到了零,這個(gè)任務(wù)就進(jìn)入了就緒態(tài)。具體代碼如下:

       

        應(yīng)用軟件

        軟件整體設(shè)計(jì)思路

        將μC/OS-II引入嵌入式系統(tǒng)后,應(yīng)用程序的設(shè)計(jì)就變得非常簡(jiǎn)單。盡管真空爐控制功能繁多,但可以將比較復(fù)雜的程序?qū)哟位凑展δ軇澐譃槎鄠€(gè)任務(wù),各個(gè)任務(wù)可以分別編寫,但要事先設(shè)計(jì)好任務(wù)間的通信方式,這樣程序?qū)⒏菀组_(kāi)發(fā)與維護(hù)。

        我們根據(jù)應(yīng)完成的功能將應(yīng)用軟件劃分為十個(gè)用戶任務(wù)和4個(gè)ISR,按照任務(wù)的重要性和是否具有硬實(shí)時(shí)性來(lái)分配優(yōu)先級(jí),優(yōu)先級(jí)數(shù)值越低,任務(wù)的優(yōu)先級(jí)越高。所有給任務(wù)分配的優(yōu)先級(jí)都是在用戶自定義頭文件userdef.h中用宏來(lái)定義的,由于保護(hù)處理任務(wù)需要大量的局部變量空間,故而該任務(wù)的堆棧非常大,為2048字節(jié),其余任務(wù)均為128字節(jié)。所有任務(wù)的編號(hào)、名稱和功能描述如表2所列。

        任務(wù)介紹

        任務(wù)其實(shí)就是一個(gè)簡(jiǎn)單的無(wú)限循環(huán)的程序,該程序可以認(rèn)為CPU完全只屬于它自己。在循環(huán)中必須調(diào)用延時(shí)或等待消息等函數(shù),以便將CPU控制權(quán)交給其他的任務(wù)。在上述任務(wù)中,比較復(fù)雜的就是保護(hù)處理任務(wù)。它根據(jù)A/D中斷子程序中采集到的瞬時(shí)值計(jì)算出電流的基波及二次諧波分量,結(jié)合相應(yīng)的電壓信號(hào),判斷是否有線路故障,如是則啟動(dòng)故障后錄波,然后向主站上報(bào)故障信息。除此之外,該任務(wù)還能配合通信任務(wù)進(jìn)行遠(yuǎn)方或當(dāng)?shù)囟ㄖ嫡āH蝿?wù)流程從略。

        系統(tǒng)性能測(cè)試

        CPU使用率

        μC/OS-Ⅱ提供一個(gè)計(jì)算CPU使用率的統(tǒng)計(jì)任務(wù)OSTaskStat()。該任務(wù)每秒鐘運(yùn)行一次,計(jì)算當(dāng)前的CPU使用率。如果應(yīng)用程序打算使用統(tǒng)計(jì)任務(wù),必須在初始化時(shí)建立一個(gè)的任務(wù),并且只在這個(gè)任務(wù)中調(diào)用OSStatInit()。換句話說(shuō),在調(diào)用系統(tǒng)啟動(dòng)函數(shù)OSStart()之前,必須先建立一個(gè)任務(wù),在這個(gè)任務(wù)中調(diào)用統(tǒng)計(jì)初始化函數(shù)OSStatInit(),然后再建立應(yīng)用程序中的其他任務(wù)。

        任務(wù)堆棧使用情況

        有時(shí)候決定任務(wù)實(shí)際所需的堆棧大小是很有必要的,這樣我們就可以避免為任務(wù)分配過(guò)多的堆棧空間。μC/OS-II提供的函數(shù)OSTaskStkChk()可以為開(kāi)發(fā)者提供這種有價(jià)值的信息。每調(diào)用一次該函數(shù),就會(huì)執(zhí)行一次堆棧檢驗(yàn)。每次在調(diào)用OSTaskStkChk()的時(shí)候,可能會(huì)得到不同的空閑空間數(shù)。應(yīng)該讓應(yīng)用程序運(yùn)行足夠長(zhǎng)的時(shí)間,才有可能經(jīng)歷壞的堆棧使用情況,這樣才能得到正確的信息,我們就可以據(jù)此重新設(shè)置堆棧的終容量了。

        實(shí)測(cè)證明,采用μC/OS-II提高了系統(tǒng)的實(shí)時(shí)性,特別是提高了通信處理和保護(hù)處理等較高優(yōu)先級(jí)任務(wù)的響應(yīng)速度。在滿足系統(tǒng)對(duì)實(shí)時(shí)性的整體要求的基礎(chǔ)上,μC/OS-II所采用的基于優(yōu)先級(jí)的調(diào)度策略可以限度地滿足關(guān)鍵的任務(wù)。同時(shí)以μC/OS-II作為整個(gè)軟件體系的基礎(chǔ),非常方便應(yīng)用軟件的模塊化設(shè)計(jì)。各個(gè)任務(wù)之間除通過(guò)μC/OS-II提供的函數(shù)進(jìn)行通信之外,沒(méi)有其他的聯(lián)系途徑,這種松耦合結(jié)構(gòu)提高了整個(gè)軟件的可靠性。

      免費(fèi)預(yù)約試聽(tīng)課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲综合五月天国产AV | 午夜爽爽爽免费视频在线观看 | 最新国产精品自产在线观看 | 亚洲日韩欧美九九精品综合网 | 亚洲一区二区经典在线播放 | 亚洲综合性色AⅤ一区二区三区 |