μC/OS-II在80x86上的移植
OS_CPU_C.C中未定義,此函數(shù)為用戶定義。其用法請參考例程3。
9.05.06 OSTimeTickHook()
OS_CPU_C.C中未定義,此函數(shù)為用戶定義。
9.06 內(nèi)存占用
表9.1列出了指定初始化常量的情況下,μC/OS-II占用內(nèi)存的情況,包括數(shù)據(jù)和程序代碼。如果μC/OS-II用于嵌入式系統(tǒng),則數(shù)據(jù)指RAM的占用,程序代碼指ROM的占用。內(nèi)存占用的說明清單隨磁盤一起提供給用戶,在安裝μC/OS-II后,查看SOFTWAREuCOS-
IIIx836LDOC目錄下的ROM-RAM.XLS文件。 該文件為MicrosoftExcel文件, 需要Office97
或更高版本的Excel打開。
表9.1中所列出的內(nèi)存占用大小都近似為25字節(jié)的倍數(shù)。筆者所用的BorlandC/C++V3.1設定為編譯產(chǎn)生運行速度最快的目標代碼,所以表中所列的數(shù)字并不是絕對的,但可以給讀者一個總的概念。例如,如果不使用消息隊列機制,在編譯前將OS_Q_EN設為0,則編譯后的目標代碼長度6,875字節(jié),可減小大約1,475字節(jié)。
此外,空閑任務(idle)和統(tǒng)計任務(statistics)的堆棧都設為1,024字節(jié)(1Kb)。根據(jù)您自己的要求可以增減。μC/OS-II的數(shù)據(jù)結構最少需要35字節(jié)的RAM。
表9.2說明了如何裁減μC/OS-II,應用在更小規(guī)模的系統(tǒng)上。此處的小系統(tǒng)有16個任務。
并且不采用如下功能:
?郵箱功能(OS_MBOX_EN設為0)
?內(nèi)存管理機制(OS_MEM_EN設為0)
?動態(tài)改變?nèi)蝿諆?yōu)先級(OS_TASK_CHANGE_PRIO_EN設為0)
?舊版本的任務創(chuàng)建函數(shù)OSTaskCreate()(OS_TASK_CREATE_EN設為0)
?任務刪除(OS_TASK_DEL_EN設為0)
?掛起和喚醒任務(OS_TASK_SUSPEND_EN設為0)
采取上述措施后, 程序代碼空間可以減小3Kb, 數(shù)據(jù)空間可以減小2,200字節(jié)。 由于只有16個任務運行,節(jié)省了大量用于任務控制塊OS_TCB的空間。在80x86的大模式編譯條件下,每一個OS_TCB將占用45字節(jié)的RAM。
9.07 運行時間
表9.3到9.5列出了大部分μC/OS-II函數(shù)在80186處理器上的運行時間。 統(tǒng)計的方法是將C原程序編譯為匯編代碼,然后計算每條匯編指令所需的時鐘周期,根據(jù)處理器的時鐘頻率,最后算出運行時間。表中的I 欄為函數(shù)包含有多少條指令,C 欄為函數(shù)運行需要多少時鐘周期,μs為運行所需的以微秒為單位的時間。表中有3類時間,分別是在函數(shù)中關閉中斷的時間、函數(shù)運行的最小時間和最大時間。如果您不使用80186處理器,表中的數(shù)據(jù)就沒有什么實際意義,但可以使您理解每個函數(shù)運行時間的相對大小。
表 9.1μC/OS-II 內(nèi)存占用( 80186).
表 9.2 壓縮后的μC/OS-II配置.
以上各表中的時間數(shù)據(jù)都是假設函數(shù)成功運行,正常返回;同時假定處理器工作在最大總線速度。平均來說,80186處理器的每條指令需要10個時鐘周期。
對于80186處理器,μC/OS-II中的函數(shù)最大的關閉中斷時間是33.3μs,約1,100個時鐘周期。
N/A是指該函數(shù)的運行時間長短并不重要,例如一些只執(zhí)行一次初始化函數(shù)。
如果您用的是x86系列的其他CPU,您可以根據(jù)表中每個函數(shù)的運行時鐘周期項估計當前CPU的執(zhí)行時間。例如,如果用80486,且知80486的指令平均用2個時鐘周期;或者知道80486總線頻率為66MHz(比80186的33MHz快2倍),都可以估計出函數(shù)在80486上的執(zhí)行時間。
表 9.3μC/OS-II函數(shù)在33MHz80186上的執(zhí)行時間.
表9.3μC/OS-II函數(shù)在33MHz80186上的執(zhí)行時間.(續(xù)表)內(nèi)存管理
表9.3μC/OS-II函數(shù)在33MHz80186上的執(zhí)行時間.(續(xù)表)
下面我們將討論每個函數(shù)的關閉中斷時間,最大、最小運行時間是如何計算的,以及這樣計算的先決條件。
OSSchedUnlock()
最小運行時間是當變量OSLockNesting減為0,且系統(tǒng)中沒有更高優(yōu)先級的任務就緒,SSchedUnlock()正常結束返回調(diào)用者。
最大運行時間是也是當變量OSLockNesting減為0,但有更高優(yōu)先級的任務就緒,函數(shù)中需要進行任務切換。
OSIntExit()
最小運行時間是當變量OSLockNesting減為0,且系統(tǒng)中沒有更高優(yōu)先級的任務就緒,OSIntExit()正常結束返回被中斷任務。
最大運行時間是也是當變量OSLockNesting減為0,但有更高優(yōu)先級的任務就緒,OSIntExit()將不返回調(diào)用者,經(jīng)過任務切換操作后,將直接返回就緒的任務。
OSTickISR()
此函數(shù)假定在當前μC/OS-II中運行有最大數(shù)目的任務(64個)。
最小運行時間是當64個任務都不在等待延時狀態(tài)。也就是說,所有的任務都不需要OSTickISR()處理。
最大運行時間是當63個任務(空閑進程不會延時等待)都處于延時狀態(tài),此時OSTickISR()需要逐個檢查等待中的任務,將計數(shù)器減1,并判斷是否延時結束。這種情況對于系統(tǒng)是一個很重的負荷。例如在最壞的情況,設時鐘節(jié)拍間隔10ms,OSTickISR()需要625μs,占了約6%的CPU利用率。但請注意,此時所有的任務都沒有執(zhí)行,只是內(nèi)核的開銷。
OSMboxPend()
最小運行時間是當郵箱中有消息需要處理的時候。
最大運行時間是當郵箱中沒有消息,任務需要等待的時候。此時調(diào)用OSMboxPend()的任務將被掛起,進行任務切換。最大運行時間是同一任務執(zhí)行OSMboxPend()的累計時間,這個過程包括OSMboxPend()查看郵箱,發(fā)現(xiàn)沒有消息,再調(diào)用任務切換函數(shù)OSSched(),切換到新任務。當由于某種原因調(diào)用OSMboxPend()的任務又被喚醒執(zhí)行,從OSSched()中返回,發(fā)現(xiàn)返回的原因是由于延時結束(處理延時結束情況的代碼最長—譯者注),最后返回調(diào)用任務。OSMboxPend()的最大運行時間是上述時間的總和。
評論