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