實(shí)時(shí)操作系統(tǒng) (RTOS) 正在進(jìn)入越來(lái)越多的系統(tǒng)。習(xí)慣于裸機(jī)開發(fā)或使用高度資源受限系統(tǒng)的嵌入式開發(fā)人員經(jīng)常會(huì)抱怨系統(tǒng)性能或內(nèi)存使用情況。以下是開發(fā)人員可以遵循的七個(gè)技巧,以幫助優(yōu)化其 RTOS 的性能和代碼大小。
1. 最小化應(yīng)用程序中的任務(wù)
將應(yīng)用程序分解為看似同時(shí)運(yùn)行的單獨(dú)任務(wù)“小程序”的能力非常有益。但是,不熟悉 RTOS 開發(fā)的開發(fā)人員有時(shí)可能會(huì)有點(diǎn)過分熱心并創(chuàng)建比應(yīng)用程序所需的任務(wù)更多的任務(wù)。一些額外的任務(wù)有什么害處?在應(yīng)用程序中創(chuàng)建的每個(gè)任務(wù)都需要?jiǎng)?chuàng)建任務(wù)控制塊 (TCB) 來(lái)管理任務(wù)。TCB 包含至少幾十個(gè)用于跟蹤任務(wù)的不同變量。(此處可以看到來(lái)自 uCOS/III 的 TCB 示例。)可以想象,TCB 不會(huì)使用大量?jī)?nèi)存,但隨著越來(lái)越多的任務(wù)添加,內(nèi)存使用會(huì)迅速膨脹。出于這個(gè)原因,希望盡量減少使用多少代碼空間的開發(fā)人員應(yīng)該盡量減少應(yīng)用程序中的任務(wù)數(shù)量。
2. 使用內(nèi)存塊池而不是字節(jié)池
內(nèi)存字節(jié)池本質(zhì)上是一個(gè)堆。開發(fā)人員可以在程序執(zhí)行期間動(dòng)態(tài)請(qǐng)求內(nèi)存,就像他們使用 malloc 一樣。在許多情況下,使用堆或字節(jié)池會(huì)導(dǎo)致影響實(shí)時(shí)系統(tǒng)性能的不確定行為。為了確保系統(tǒng)及時(shí)運(yùn)行,嵌入式開發(fā)人員可以使用塊池來(lái)代替,它以一種確定的方式運(yùn)行,并且也不存在碎片問題。
3. 不要?jiǎng)?chuàng)建和銷毀對(duì)象
創(chuàng)建任務(wù)、信號(hào)量、消息隊(duì)列和其他 RTOS 對(duì)象通常會(huì)導(dǎo)致動(dòng)態(tài)分配內(nèi)存。創(chuàng)建和銷毀 RTOS 對(duì)象將使用 malloc 和 free,這又是不確定的,可能會(huì)導(dǎo)致性能問題。與創(chuàng)建和銷毀對(duì)象相關(guān)的開銷,特別是如果經(jīng)常這樣做,可能會(huì)成為系統(tǒng)障礙,更不用說(shuō)它如何增加代碼復(fù)雜性并使程序難以遵循。在可能的情況下,在應(yīng)用程序初始化期間分配所有對(duì)象,并讓它們?cè)趹?yīng)用程序的整個(gè)生命周期中持續(xù)存在。這樣,對(duì)象的行為就好像它們是靜態(tài)分配的,而不是動(dòng)態(tài)分配的。
4.考慮使用事件標(biāo)志
事件標(biāo)志可用于同步任務(wù),類似于使用信號(hào)量同步任務(wù)的方式。從性能角度比較事件標(biāo)志和信號(hào)量時(shí),事件標(biāo)志通常使用更少的內(nèi)存并且執(zhí)行得更快。嵌入式開發(fā)人員應(yīng)考慮比較其 RTOS 的內(nèi)存占用和執(zhí)行時(shí)間,以確定他們可以從應(yīng)用程序中擠出幾個(gè)額外字節(jié)或微秒的位置。
5. 最小化 RTOS 對(duì)象
大多數(shù) RTOS 對(duì)象都需要一個(gè)控制塊。應(yīng)用程序中的任務(wù)、信號(hào)量、消息隊(duì)列等越多,內(nèi)存使用量就越大。通過限制在運(yùn)行時(shí)創(chuàng)建的 RTOS 對(duì)象的數(shù)量,可以最大限度地減少內(nèi)存使用。
6.優(yōu)化任務(wù)棧
任務(wù)堆棧因在應(yīng)用程序中消耗最多的內(nèi)存而臭名昭著。許多開發(fā)人員只是猜測(cè)一個(gè)值而不是進(jìn)行測(cè)量。許多 RTOS 會(huì)建議任務(wù)的默認(rèn)堆棧大小約為 1 kB。是不是太多了? 太少了? 如果不進(jìn)行測(cè)量,就無(wú)法判斷,因此開發(fā)人員只會(huì)猜測(cè)。結(jié)果是為堆棧空間分配了太多內(nèi)存并浪費(fèi)了。開發(fā)人員應(yīng)利用與 RTOS 相關(guān)的堆棧監(jiān)控功能來(lái)確定其最小、最大和平均堆棧使用情況。從最大值開始,額外增加 25% 將是確定堆棧大小的安全經(jīng)驗(yàn)法則。
7.關(guān)閉未使用的功能
RTOS 是極其豐富和復(fù)雜的軟件系統(tǒng)。它們包含許多并非每個(gè)應(yīng)用程序或開發(fā)人員都可以使用的功能。熟悉 RTOSes 配置文件對(duì)于最小化內(nèi)存使用和代碼大小非常有幫助。配置文件允許開發(fā)人員啟用和禁用功能。
使用 RTOS 不一定需要增強(qiáng)型微控制器或大量?jī)?nèi)存。嵌入式開發(fā)人員構(gòu)建和使用他們的 RTOS 的方式可以決定它是在資源受限的環(huán)境中運(yùn)行良好還是被標(biāo)記為膨脹代碼。這七個(gè)技巧只是幫助你開始優(yōu)化 RTOS 的一些技巧。