新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > μC/OS-II的內核結構

        μC/OS-II的內核結構

        作者: 時間:2016-10-08 來源:網絡 收藏

        z 在文件OS_CFG.H中,OS_TASK_STAT_EN是設為1的。

        z 在文件OS_CFG.H中,OS_LOWEST_PRIO是設為63的。

        z 在文件OS_CFG.H中,最多任務數OS_MAX_TASKS是設成大于2的。

        以上兩個任務的任務控制塊(OS_TCBs)是用雙向鏈表鏈接在一起的。OSTCBList指向這個鏈表的起始處。當建立一個任務時,這個任務總是被放在這個鏈表的起始處。換句話說,OSTCBList總是指向最后建立的那個任務。鏈的終點指向空字符NULL(也就是零)。

        因為這兩個任務都處在就緒態,在就緒任務表OSRdyTbl[]中的相應位是設為1的。還有,因為這兩個任務的相應位是在OSRdyTbl[]的同一行上,即屬同一組,故OSRdyGrp中只有1位是設為1的。

        μC/OS-Ⅱ還初始化了4個空數據結構緩沖區,如圖F3.8所示。每個緩沖區都是單向鏈

        表,允許μC/OS-Ⅱ從緩沖區中迅速得到或釋放一個緩沖區中的元素。注意,空任務控制塊

        在空緩沖區中的數目取決于最多任務數OS_MAX_TASKS,這個最多任務數是在OS_CFG.H文件

        中定義的。μC/OS-Ⅱ自動安排總的系統任務數OS_N_SYS_TASKS(見文件μC/OS-Ⅱ.H)。控

        制塊OS_TCB的數目也就自動確定了。當然,包括足夠的任務控制塊分配給統計任務和空閑

        任務。指向空事件表OSEventFreeList和空隊列表OSFreeList的指針將在第6章,任務間

        通訊與同步中討論。指向空存儲區的指針表OSMemFreeList將在第7章存儲管理中討論。

        3.12 μC/OS-Ⅱ的啟動

        多任務的啟動是用戶通過調用 OSStart()實現的。然而,啟動μC/OS-Ⅱ之前,用戶至少

        要建立一個應用任務,如程序清單L3.24所示。

        程序清單L3.24初始化和啟動μC/OS-Ⅱ

        voidmain(void)

        {

        OSInit();/* 初始化uC/OS-II*/

        .

        .

        通過調用OSTaskCreate()或OSTaskCreateExt()創建至少一個任務;

        .

        .

        OSStart();/* 開始多任務調度!OSStart()永遠不會返回 */

        }

        圖3.7調用OSInit()之后的數據結構

        圖3.8空緩沖區

        OSStart()的代碼如程序清單L3.25所示。當調用OSStart()時,OSStart()從任務就緒表中找出那個用戶建立的優先級最高任務的任務控制塊[L3.25(1)]。然后,OSStart()調用高優先級就緒任務啟動函數 OSStartHighRdy()[L3,25(2)],(見匯編語言文件 OS_CPU_A.ASM),這個文件與選擇的微處理器有關。實質上,函數OSStartHighRdy()是將任務棧中保存的值彈回到 CPU 寄存器中,然后執行一條中斷返回指令,中斷返回指令強制執行該任務代碼。見9.04.01節,高優先級就緒任務啟動函數 OSStartHighRdy()。那一節詳細介紹對于 80x86微處理器是怎么做的。注意,OSStartHighRdy()將永遠不返回到 OSStart()。

        程序清單 L3.25 啟動多任務.

        voidOSStart(void)

        {

        INT8Uy;

        INT8Ux;

        if(OSRunning==FALSE){

        y=OSUnMapTbl[OSRdyGrp];

        x=OSUnMapTbl[OSRdyTbl[y]];

        OSPrioHighRdy=(INT8U)((y3)+x);

        OSPrioCur=OSPrioHighRdy;

        OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];(1)

        OSTCBCur=OSTCBHighRdy;

        OSStartHighRdy();(2)

        }

        }

        多任務啟動以后變量與數據結構中的內容如圖 F3.9 所示。這里筆者假設用戶建立的任務優先級為 6,注意,OSTaskCtr指出已經建立了 3 個任務。OSRunning已設為“真” ,指出多任務已經開始, OSPrioCur和 OSPrioHighRdy存放的是用戶應用任務的優先級, OSTCBCur和 OSTCBHighRdy二者都指向用戶任務的任務控制塊。

        3.13 獲取當前μC/OS-Ⅱ的版本號

        應用程序調用OSVersion()[程序清單L3.26]可以得到當前μC/OS-Ⅱ的版本號。

        OSVersion()函數返回版本號值乘以100。換言之,200表示版本號2.00。

        程序清單L3.26得到μC/OS-Ⅱ當前版本號

        INT16UOSVersion(void)

        {

        return(OS_VERSION);

        }

        為找到μC/OS-Ⅱ的最新版本以及如何做版本升級,用戶可以與出版商聯系,或者查看

        μC/OS-Ⅱ得正式網站WWW.uCOS-II.COM

        圖3.9調用OSStart()以后的變量與數據結構

        3.14 OSEvent()函數

        讀者或許注意到有4個OS_CORE.C中的函數沒有在本章中提到。這4個函數是

        OSEventWaitListInit(),OSEventTaskRdy(),OSEventTaskWait(),OSEventTO()。這幾個

        函數是放在文件OS_CORE.C中的,而對如何使用這個函數的解釋見第6章,任務間的通訊與

        同步。


        上一頁 1 2 3 4 5 6 7 8 9 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 黄浦区| 始兴县| 两当县| 靖宇县| 松江区| 达日县| 霍州市| 辽宁省| 友谊县| 玉环县| 文成县| 赤峰市| 桦甸市| 城市| 岢岚县| 行唐县| 沙河市| 安庆市| 枣庄市| 庐江县| 双城市| 革吉县| 应城市| 巴彦淖尔市| 正宁县| 广南县| 信阳市| 娱乐| 广水市| 鹤岗市| 横峰县| 墨脱县| 桐乡市| 罗甸县| 葵青区| 崇仁县| 长兴县| 青阳县| 平阴县| 平和县| 梅州市|