新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > μC/OS-II在80x86上的移植

        μC/OS-II在80x86上的移植

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

        OS_CPU_C.C中未定義,此函數為用戶定義。其用法請參考例程3。

        9.05.06 OSTimeTickHook()

        OS_CPU_C.C中未定義,此函數為用戶定義。

        9.06 內存占用

        表9.1列出了指定初始化常量的情況下,μC/OS-II占用內存的情況,包括數據和程序代碼。如果μC/OS-II用于嵌入式系統,則數據指RAM的占用,程序代碼指ROM的占用。內存占用的說明清單隨磁盤一起提供給用戶,在安裝μC/OS-II后,查看SOFTWAREuCOS-

        IIIx836LDOC目錄下的ROM-RAM.XLS文件。 該文件為MicrosoftExcel文件, 需要Office97

        或更高版本的Excel打開。

        表9.1中所列出的內存占用大小都近似為25字節的倍數。筆者所用的BorlandC/C++V3.1設定為編譯產生運行速度最快的目標代碼,所以表中所列的數字并不是絕對的,但可以給讀者一個總的概念。例如,如果不使用消息隊列機制,在編譯前將OS_Q_EN設為0,則編譯后的目標代碼長度6,875字節,可減小大約1,475字節。

        此外,空閑任務(idle)和統計任務(statistics)的堆棧都設為1,024字節(1Kb)。根據您自己的要求可以增減。μC/OS-II的數據結構最少需要35字節的RAM。

        表9.2說明了如何裁減μC/OS-II,應用在更小規模的系統上。此處的小系統有16個任務。

        并且不采用如下功能:

        ?郵箱功能(OS_MBOX_EN設為0)

        ?內存管理機制(OS_MEM_EN設為0)

        ?動態改變任務優先級(OS_TASK_CHANGE_PRIO_EN設為0)

        ?舊版本的任務創建函數OSTaskCreate()(OS_TASK_CREATE_EN設為0)

        ?任務刪除(OS_TASK_DEL_EN設為0)

        ?掛起和喚醒任務(OS_TASK_SUSPEND_EN設為0)

        采取上述措施后, 程序代碼空間可以減小3Kb, 數據空間可以減小2,200字節。 由于只有16個任務運行,節省了大量用于任務控制塊OS_TCB的空間。在80x86的大模式編譯條件下,每一個OS_TCB將占用45字節的RAM。

        9.07 運行時間

        表9.3到9.5列出了大部分μC/OS-II函數在80186處理器上的運行時間。 統計的方法是將C原程序編譯為匯編代碼,然后計算每條匯編指令所需的時鐘周期,根據處理器的時鐘頻率,最后算出運行時間。表中的I 欄為函數包含有多少條指令,C 欄為函數運行需要多少時鐘周期,μs為運行所需的以微秒為單位的時間。表中有3類時間,分別是在函數中關閉中斷的時間、函數運行的最小時間和最大時間。如果您不使用80186處理器,表中的數據就沒有什么實際意義,但可以使您理解每個函數運行時間的相對大小。

        表 9.1μC/OS-II 內存占用( 80186).

        表 9.2 壓縮后的μC/OS-II配置.

        以上各表中的時間數據都是假設函數成功運行,正常返回;同時假定處理器工作在最大總線速度。平均來說,80186處理器的每條指令需要10個時鐘周期。

        對于80186處理器,μC/OS-II中的函數最大的關閉中斷時間是33.3μs,約1,100個時鐘周期。

        N/A是指該函數的運行時間長短并不重要,例如一些只執行一次初始化函數。

        如果您用的是x86系列的其他CPU,您可以根據表中每個函數的運行時鐘周期項估計當前CPU的執行時間。例如,如果用80486,且知80486的指令平均用2個時鐘周期;或者知道80486總線頻率為66MHz(比80186的33MHz快2倍),都可以估計出函數在80486上的執行時間。

        表 9.3μC/OS-II函數在33MHz80186上的執行時間.

        表9.3μC/OS-II函數在33MHz80186上的執行時間.(續表)內存管理

        表9.3μC/OS-II函數在33MHz80186上的執行時間.(續表)

        下面我們將討論每個函數的關閉中斷時間,最大、最小運行時間是如何計算的,以及這樣計算的先決條件。

        OSSchedUnlock()

        最小運行時間是當變量OSLockNesting減為0,且系統中沒有更高優先級的任務就緒,SSchedUnlock()正常結束返回調用者。

        最大運行時間是也是當變量OSLockNesting減為0,但有更高優先級的任務就緒,函數中需要進行任務切換。

        OSIntExit()

        最小運行時間是當變量OSLockNesting減為0,且系統中沒有更高優先級的任務就緒,OSIntExit()正常結束返回被中斷任務。

        最大運行時間是也是當變量OSLockNesting減為0,但有更高優先級的任務就緒,OSIntExit()將不返回調用者,經過任務切換操作后,將直接返回就緒的任務。

        OSTickISR()

        此函數假定在當前μC/OS-II中運行有最大數目的任務(64個)。

        最小運行時間是當64個任務都不在等待延時狀態。也就是說,所有的任務都不需要OSTickISR()處理。

        最大運行時間是當63個任務(空閑進程不會延時等待)都處于延時狀態,此時OSTickISR()需要逐個檢查等待中的任務,將計數器減1,并判斷是否延時結束。這種情況對于系統是一個很重的負荷。例如在最壞的情況,設時鐘節拍間隔10ms,OSTickISR()需要625μs,占了約6%的CPU利用率。但請注意,此時所有的任務都沒有執行,只是內核的開銷。

        OSMboxPend()

        最小運行時間是當郵箱中有消息需要處理的時候。

        最大運行時間是當郵箱中沒有消息,任務需要等待的時候。此時調用OSMboxPend()的任務將被掛起,進行任務切換。最大運行時間是同一任務執行OSMboxPend()的累計時間,這個過程包括OSMboxPend()查看郵箱,發現沒有消息,再調用任務切換函數OSSched(),切換到新任務。當由于某種原因調用OSMboxPend()的任務又被喚醒執行,從OSSched()中返回,發現返回的原因是由于延時結束(處理延時結束情況的代碼最長—譯者注),最后返回調用任務。OSMboxPend()的最大運行時間是上述時間的總和。



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 安国市| 贡嘎县| 承德市| 来凤县| 鄄城县| 莫力| 盘山县| 连山| 汪清县| 龙州县| 武乡县| 芦溪县| 仙桃市| 曲水县| 乐至县| 石渠县| 绵竹市| 东安县| 桃源县| 祁阳县| 衡阳市| 准格尔旗| 方正县| 运城市| 华阴市| 清远市| 阿尔山市| 紫阳县| 嘉善县| 静宁县| 恩平市| 南开区| 邯郸县| 凭祥市| 积石山| 周宁县| 泸定县| 嘉峪关市| 抚宁县| 门头沟区| 凤台县|