μC/OS-II在80x86上的移植
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()的最大運行時間是上述時間的總和。
評論