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