實時操作系統(tǒng)已經(jīng)成為許多嵌入式系統(tǒng)中的關(guān)鍵組件,從裸機調(diào)度過渡到RTOS可能是一件棘手的事情。這里有七個小技巧可以幫助嵌入式開發(fā)人員更輕松地完成過渡。
技巧1——首先規(guī)劃好你的架構(gòu)
如果你從未使用過UML或者對軟件架構(gòu)不感興趣,現(xiàn)在是時候?qū)W習(xí)一下了。使用RTOS時,開發(fā)人員仔細考慮每項任務(wù)、同步和通信機制是至關(guān)重要的。這些細節(jié)不能僅僅存儲在工程師的頭腦中,而是需要以圖表的形式記錄下來,以便在需要時可以查看和更新。開發(fā)一個基于RTOS的應(yīng)用程序會很快變得復(fù)雜,考慮清楚應(yīng)用程序的行為是很重要的。
技巧2——仔細跟蹤內(nèi)存使用情況
與開發(fā)裸機應(yīng)用程序不同,RTOS任務(wù)和同步結(jié)構(gòu)會很快耗盡資源受限設(shè)備中的內(nèi)存。開發(fā)人員需要非常小心地監(jiān)控內(nèi)存,并跟蹤內(nèi)存的去向。創(chuàng)建六個任務(wù)、幾個信號量和互斥體,卻發(fā)現(xiàn)malloc因為所有堆空間都已被使用而失敗,這種情況并不罕見。
技巧3——預(yù)先創(chuàng)建所有的任務(wù)
RTOS為嵌入式開發(fā)人員提供了廣泛的功能,例如創(chuàng)建任務(wù)和銷毀任務(wù)的能力。關(guān)心內(nèi)存使用的開發(fā)人員可能傾向于只在需要時創(chuàng)建任務(wù),然后在任務(wù)完成后銷毀它們。雖然這在概念上很棒,但在資源受限的系統(tǒng)中,通常沒有復(fù)雜的堆管理器可以處理堆碎片。結(jié)果可能是一個碎片堆,在程序執(zhí)行過程中的某個時刻突然沒有內(nèi)存可以分配。建議在系統(tǒng)初始化期間創(chuàng)建所有使用堆的對象。結(jié)果似乎是靜態(tài)分配的對象,如果存在內(nèi)存問題,該問題將在系統(tǒng)啟動時顯現(xiàn)出來。
技巧 4–永遠不要關(guān)閉堆棧保護!
裸機開發(fā)者通常癡迷于編寫盡可能高效的代碼。意識到存在使用時鐘周期的堆棧監(jiān)視器成為優(yōu)化和移除的誘人目標。不要這樣做!堆棧監(jiān)視器用于檢測堆棧溢出和其他與堆棧相關(guān)的問題。雖然它確實使用了幾個時鐘周期,但好處遠遠超過了性能成本。
技巧5——優(yōu)化每個任務(wù)堆棧
不要依賴默認的堆棧大小。在許多RTOSes中,任務(wù)的默認堆棧大小大約是0x200。這通常是堆棧深度,而不是使用的字節(jié)數(shù)!僅僅是一個閃爍的LED的任務(wù)就可能使用了整整千字節(jié)的堆空間!嵌入式開發(fā)人員確保執(zhí)行最壞情況堆棧分析,并適當?shù)卮_定每個任務(wù)堆棧的大小。從長遠來看,這將有助于節(jié)省內(nèi)存!
技巧 6–啟用RTOS感知調(diào)試
現(xiàn)代微控制器有一些非??岬恼{(diào)試功能,如實時跟蹤和RTOS感知調(diào)試。在微控制器和RTOS中啟用這些功能。它們將允許開發(fā)人員跟蹤哪些任務(wù)運行了多長時間,以什么順序運行,并且可以幫助識別許多與RTOS相關(guān)的常見問題。
技巧7——仔細選擇任務(wù)優(yōu)先級
預(yù)先開發(fā)一個軟件非常有用的一個原因是,它提供了系統(tǒng)中發(fā)生的所有事情的大畫面。有了這個大圖,決定系統(tǒng)中每個任務(wù)的優(yōu)先級就變得更容易了。必須仔細選擇優(yōu)先級,以確保任務(wù)不會耗盡CPU時間,并確保系統(tǒng)中不會出現(xiàn)優(yōu)先級反轉(zhuǎn)等問題。
RTOS 是極其豐富和復(fù)雜的軟件系統(tǒng)。它們包含許多并非每個應(yīng)用程序或開發(fā)人員都可以使用的功能。熟悉 RTOSes 配置文件對于最小化內(nèi)存使用和代碼大小非常有幫助。配置文件允許開發(fā)人員啟用和禁用功能。
使用 RTOS 不一定需要增強型微控制器或大量內(nèi)存。嵌入式開發(fā)人員構(gòu)建和使用他們的 RTOS 的方式可以決定它是在資源受限的環(huán)境中運行良好還是被標記為膨脹代碼。這七個技巧只是幫助你開始優(yōu)化 RTOS 的一些技巧。