新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > UC/OS II嵌入式技術

        UC/OS II嵌入式技術

        作者: 時間:2016-09-12 來源:網絡 收藏

        3 主體移植過程

        3.1 設置與處理器及編譯器相關的代碼[OS_CPU.H]

        不同的編譯器會使用不同的字節長度來表示同一數據類型,所以要定義一系列數據類型以確保移植的正確性。下面是uC/OS II定義的一部分數據類型。

        typedef unsigned char BOOLEAN;

        typedef unsigned char INT8U;

        typedef signed char INT16S;

        typedef unsigned int INT16U;

        typedef signed int INT16S;

        typedef unsigned long INT32U;

        typedef signed long INT32S;

        typedef float FP32;

        typedef double FP64;

        typedef unsigned int OS_STK;

        typedef unsigned int OS_CPU_SR;

        uC/OS II需要先關中斷再訪問臨界區的代碼,并且在訪問完后重新允許中斷。uC/OS II定義了兩個宏來禁止和允許中斷:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),本移植實現這兩個宏的匯編代碼。

        #define OS_ENTER_CRITICAL()(cpu_sr=OSCPUSaveSR())

        #define OS_EXIT_CRITICAL()(OSCPURestoreSR(cpu_sr))

        EXPORT OSCPUSaveSR

        OSCPUSaveSR

        mrs r1,cpsr

        mov r0,r1

        orr r1,r1,#0xc0

        msr cpsr_cxsf,r1

        mov pc,lr

        EXPORT OSCPURestoreSR

        OSCPURestoreSR

        msr cpsr_cxsf,r0

        mov pc,lr

        3.2 用C語言實現與處理器任務相關的函數[OS_CPU_C.C]

        OSTaskStkInit()

        OSTaskCreateHook()

        OSTaskDelHook()

        OSTaskSwHook()

        OSTaskStatHook()

        OSTimeTickHook()

        實際需要修改的只有OSTaskStkInit()函數,其他五個函數需要聲明,但不一定有實際內容。這五個函數都是用戶定義的,所以OS_CPU_C.C中沒有給出代碼。如果需要使用這些函數,可以將文件OS_CFG.H中的#define constant OS_CPU_HOOKS_EN設為1,設為0表示不使用這些函數。

        OSTaskStkInit()函數由OSTaskCreate()或OSTaskCreateExt()調用,需要傳遞的參數是任務代碼的起始地址、參數指針(pdata)、任務堆棧頂端的地址和任務的優先級,用來初始化任務的堆棧,初始狀態的堆棧模擬發生一次中斷后的堆棧結構。堆棧初始化工作結束后,OSTaskStkInit()返回新的堆棧棧頂指針,OSTaskCreate()或OSTaskCreateExt()將指針保存在任務的OS_TCB中。調用OSTaskStkInit()給任務做一個初始的任務上下文堆棧,形狀如圖3。

        3.3 處理器相關部分匯編實現

        整個uC/OS II移植實現中,只需要提供一個匯編語言文件,提供幾個必須由匯編才能實現的函數。

        a)OSStartHighRdy()

        該函數在OSStart()多任務啟動之后,負責從最高優先級任務的TCB控制塊中獲得該任務的堆棧指針sp,通過sp依次將CPU現場恢復,此時系統就將控制權交給用戶創建的該任務的進程,直到該任務被阻塞或者被其他更高優先級的任務搶占了CPU。該函數僅僅在多任務啟動時被執行一次,用來啟動第一個,也就是最高優先級的任務執行。

        b)OSCtxSw()

        該函數是任務級的上下文切換函數,在任務因為被阻塞而主動請求與CPU調度時執行,主要工作是先將當前任務的CPU現場保存到該任務堆棧中,然后獲得最高優先級任務的堆棧指針,從該堆棧中恢復此任務的CPU現場,使之繼續執行,從而完成一次任務切換。

        C)OSIntExit()

        該函數是中斷級的任務切換函數,在時鐘中斷ISR中發現有高優先級任務在等待時,需要在中斷退出后不返回被中斷的任務,而是直接調度就緒的高優先級任務執行。其目的在于能夠盡快讓高優先級的任務得到響應,保證系統的實時性能。

        d)OSTickISR()

        該函數是時鐘中斷處理函數,主要任務是負責處理時鐘中斷,調用系統實現的OSTimeTick函數,如果有等待時鐘信號的高優先級任務,則需要在中斷級別上調度其執行。另外兩個相關函數是OSIntEnter()和OSIntExit(),都需要在ISR中執行。

        4 測試

        至此代碼移植過程已經完成,下一步工作就是測試。測試一個象uC/OS II一樣的多任務實時內核并不復雜,甚至可以在沒有應用程序的情況下測試。換句話說,就是讓這個實時內核在目標板上跑起來,讓內核自己測試自己。這樣做有兩個好處:第一,避免使本來就復雜的事情更加復雜;第二,如果出現問題,可以知道問題出在內核代碼上而不是應用程序。剛開始的時候可以運行一些簡單的任務和時鐘節拍中斷服務例程。一旦多任務調度成功地運行了,再添加應用程序的任務就是非常簡單的工作了。

        5 結束語

        采用基于ARM9的S3C2410嵌入式微處理器,可以使系統具備高性能的運算能力的同時便于與各種外設連接擴展,簡化了硬件設計,維持小型化的同時降低了系統成本。uC/OS II作為一個源代碼公開的操作系統,在具體應用中穩定可靠,并且支持uIP TCP/IP協議棧、ucGUI等,可擴展性強,功能強大。本系統采ARM9+uC/OS II開發設計,具有精度高、運行穩定、實時性好、抗干擾能力強、性價比高的特點,可以在各種工業場合中廣泛應用,達到了設計的初衷

        μC/OS-II作為一個嵌入式實時操作系統,自1992年以來,因其源代碼的完全公開和優越性能,已為眾多的愛好者和開發人員所了解并得到了廣泛應用。μC/OS-II是一個占先式內核,執行時間可確定(即函數的調用與服務的時間是可知的,不依賴于應用程序的大小),目前最多支持64個任務(8個為系統保留),總是執行處于就緒態的優先級最高的任務。目前,51系列及其擴展型單片機仍在單片機應用系統占較大比重,因而詳細介紹μC/OS-II在AT89C51上的移植實現過程,解決移植過程中出現的問題,有很大的實用意義。


        上一頁 1 2 3 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 邢台市| 云浮市| 梅州市| 福泉市| 阳西县| 虎林市| 图木舒克市| 宁强县| 莱西市| 和政县| 平阳县| 遂溪县| 仁寿县| 绿春县| 新津县| 六枝特区| 盈江县| 赫章县| 乐业县| 樟树市| 通辽市| 昌平区| 靖西县| 秭归县| 沛县| 泾阳县| 平舆县| 台东县| 田东县| 五大连池市| 禹城市| 鸡泽县| 寻乌县| 那曲县| 长白| 海安县| 三门峡市| 壤塘县| 乌兰察布市| 巴中市| 加查县|