μ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設(shè)定為編譯產(chǎn)生運(yùn)行速度最快的目標(biāo)代碼,所以表中所列的數(shù)字并不是絕對的,但可以給讀者一個(gè)總的概念。例如,如果不使用消息隊(duì)列機(jī)制,在編譯前將OS_Q_EN設(shè)為0,則編譯后的目標(biāo)代碼長度6,875字節(jié),可減小大約1,475字節(jié)。
此外,空閑任務(wù)(idle)和統(tǒng)計(jì)任務(wù)(statistics)的堆棧都設(shè)為1,024字節(jié)(1Kb)。根據(jù)您自己的要求可以增減。μC/OS-II的數(shù)據(jù)結(jié)構(gòu)最少需要35字節(jié)的RAM。
表9.2說明了如何裁減μC/OS-II,應(yīng)用在更小規(guī)模的系統(tǒng)上。此處的小系統(tǒng)有16個(gè)任務(wù)。
并且不采用如下功能:
?郵箱功能(OS_MBOX_EN設(shè)為0)
?內(nèi)存管理機(jī)制(OS_MEM_EN設(shè)為0)
?動態(tài)改變?nèi)蝿?wù)優(yōu)先級(OS_TASK_CHANGE_PRIO_EN設(shè)為0)
?舊版本的任務(wù)創(chuàng)建函數(shù)OSTaskCreate()(OS_TASK_CREATE_EN設(shè)為0)
?任務(wù)刪除(OS_TASK_DEL_EN設(shè)為0)
?掛起和喚醒任務(wù)(OS_TASK_SUSPEND_EN設(shè)為0)
采取上述措施后, 程序代碼空間可以減小3Kb, 數(shù)據(jù)空間可以減小2,200字節(jié)。 由于只有16個(gè)任務(wù)運(yùn)行,節(jié)省了大量用于任務(wù)控制塊OS_TCB的空間。在80x86的大模式編譯條件下,每一個(gè)OS_TCB將占用45字節(jié)的RAM。
9.07 運(yùn)行時(shí)間
表9.3到9.5列出了大部分μC/OS-II函數(shù)在80186處理器上的運(yùn)行時(shí)間。 統(tǒng)計(jì)的方法是將C原程序編譯為匯編代碼,然后計(jì)算每條匯編指令所需的時(shí)鐘周期,根據(jù)處理器的時(shí)鐘頻率,最后算出運(yùn)行時(shí)間。表中的I 欄為函數(shù)包含有多少條指令,C 欄為函數(shù)運(yùn)行需要多少時(shí)鐘周期,μs為運(yùn)行所需的以微秒為單位的時(shí)間。表中有3類時(shí)間,分別是在函數(shù)中關(guān)閉中斷的時(shí)間、函數(shù)運(yùn)行的最小時(shí)間和最大時(shí)間。如果您不使用80186處理器,表中的數(shù)據(jù)就沒有什么實(shí)際意義,但可以使您理解每個(gè)函數(shù)運(yùn)行時(shí)間的相對大小。
表 9.1μC/OS-II 內(nèi)存占用( 80186).

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

以上各表中的時(shí)間數(shù)據(jù)都是假設(shè)函數(shù)成功運(yùn)行,正常返回;同時(shí)假定處理器工作在最大總線速度。平均來說,80186處理器的每條指令需要10個(gè)時(shí)鐘周期。
對于80186處理器,μC/OS-II中的函數(shù)最大的關(guān)閉中斷時(shí)間是33.3μs,約1,100個(gè)時(shí)鐘周期。
N/A是指該函數(shù)的運(yùn)行時(shí)間長短并不重要,例如一些只執(zhí)行一次初始化函數(shù)。
如果您用的是x86系列的其他CPU,您可以根據(jù)表中每個(gè)函數(shù)的運(yùn)行時(shí)鐘周期項(xiàng)估計(jì)當(dāng)前CPU的執(zhí)行時(shí)間。例如,如果用80486,且知80486的指令平均用2個(gè)時(shí)鐘周期;或者知道80486總線頻率為66MHz(比80186的33MHz快2倍),都可以估計(jì)出函數(shù)在80486上的執(zhí)行時(shí)間。
表 9.3μC/OS-II函數(shù)在33MHz80186上的執(zhí)行時(shí)間.

表9.3μC/OS-II函數(shù)在33MHz80186上的執(zhí)行時(shí)間.(續(xù)表)內(nèi)存管理


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

下面我們將討論每個(gè)函數(shù)的關(guān)閉中斷時(shí)間,最大、最小運(yùn)行時(shí)間是如何計(jì)算的,以及這樣計(jì)算的先決條件。
OSSchedUnlock()
最小運(yùn)行時(shí)間是當(dāng)變量OSLockNesting減為0,且系統(tǒng)中沒有更高優(yōu)先級的任務(wù)就緒,SSchedUnlock()正常結(jié)束返回調(diào)用者。
最大運(yùn)行時(shí)間是也是當(dāng)變量OSLockNesting減為0,但有更高優(yōu)先級的任務(wù)就緒,函數(shù)中需要進(jìn)行任務(wù)切換。
OSIntExit()
最小運(yùn)行時(shí)間是當(dāng)變量OSLockNesting減為0,且系統(tǒng)中沒有更高優(yōu)先級的任務(wù)就緒,OSIntExit()正常結(jié)束返回被中斷任務(wù)。
最大運(yùn)行時(shí)間是也是當(dāng)變量OSLockNesting減為0,但有更高優(yōu)先級的任務(wù)就緒,OSIntExit()將不返回調(diào)用者,經(jīng)過任務(wù)切換操作后,將直接返回就緒的任務(wù)。
OSTickISR()
此函數(shù)假定在當(dāng)前μC/OS-II中運(yùn)行有最大數(shù)目的任務(wù)(64個(gè))。
最小運(yùn)行時(shí)間是當(dāng)64個(gè)任務(wù)都不在等待延時(shí)狀態(tài)。也就是說,所有的任務(wù)都不需要OSTickISR()處理。
最大運(yùn)行時(shí)間是當(dāng)63個(gè)任務(wù)(空閑進(jìn)程不會延時(shí)等待)都處于延時(shí)狀態(tài),此時(shí)OSTickISR()需要逐個(gè)檢查等待中的任務(wù),將計(jì)數(shù)器減1,并判斷是否延時(shí)結(jié)束。這種情況對于系統(tǒng)是一個(gè)很重的負(fù)荷。例如在最壞的情況,設(shè)時(shí)鐘節(jié)拍間隔10ms,OSTickISR()需要625μs,占了約6%的CPU利用率。但請注意,此時(shí)所有的任務(wù)都沒有執(zhí)行,只是內(nèi)核的開銷。
OSMboxPend()
最小運(yùn)行時(shí)間是當(dāng)郵箱中有消息需要處理的時(shí)候。
最大運(yùn)行時(shí)間是當(dāng)郵箱中沒有消息,任務(wù)需要等待的時(shí)候。此時(shí)調(diào)用OSMboxPend()的任務(wù)將被掛起,進(jìn)行任務(wù)切換。最大運(yùn)行時(shí)間是同一任務(wù)執(zhí)行OSMboxPend()的累計(jì)時(shí)間,這個(gè)過程包括OSMboxPend()查看郵箱,發(fā)現(xiàn)沒有消息,再調(diào)用任務(wù)切換函數(shù)OSSched(),切換到新任務(wù)。當(dāng)由于某種原因調(diào)用OSMboxPend()的任務(wù)又被喚醒執(zhí)行,從OSSched()中返回,發(fā)現(xiàn)返回的原因是由于延時(shí)結(jié)束(處理延時(shí)結(jié)束情況的代碼最長—譯者注),最后返回調(diào)用任務(wù)。OSMboxPend()的最大運(yùn)行時(shí)間是上述時(shí)間的總和。
評論