[原創] 淺談基于RTOS系統開發調試的難題

MamoYU 樓主
2021-4-28 14:02

裸機系統和RTOS系統

如今的嵌入式系統越發的復雜,不僅有一定的計算需求,還需要GUI實現人機交互,以及通過Ethernet、USB等通信接口與外部設備通信。在這樣的應用場景下,使用前后臺系統進行開發難度將會大大提升,而且之后每增加一個功能可能都會牽一發而動全身,系統的實時性難以保證。基于RTOS的系統開發方式可以很好地避免這些問題,確保系統實時性能的同時破解了系統的復雜度,也能更好的實現模塊化,利于并行開發和項目后期的維護。

RTOS的主要工作是提供多任務處理,RTOS通過在任務之間快速切換,創造了并行執行的錯覺。開發人員可以通過設置任務的優先級來確定系統的實時性。可以說,基于RTOS進行軟件開發比前后臺系統多了一個高層級的抽象。

對于從裸機開發到使用RTOS的嵌入式開發者來說,這有點像使用匯編語言編程轉換到使用C語言編程的感覺。在更高的層次上可以使設計復雜的應用程序變得更容易,但是RTOS雖然降低了應用程序源代碼的復雜性,但并沒有降低應用程序本身固有的復雜性,RTOS的并發特性也使得應用程序難以驗證和調試。例如,程序流在源代碼中已經不明顯,RTOS決定著在任何給定時刻執行哪個任務。

與前后臺系統相比,基于RTOS系統開發更加困難的是RTOS的任務不是孤立存在的個體,任務之間的相互依賴會導致任務延遲運行的差異,細微的編碼差別都可能會讓產品出現難以捉摸或者性能上的問題。當作為一個系統一起執行時,一組看似簡單的任務可能會產生復雜的運行時行為。

 

RTOS系統常見的bug

1、線程饑餓

在嵌入式多任務系統中,一些任務可能會執行緩慢,或者甚至得不到執行,常見的原因是由于優先級順序設置不正確導致。高優先級的任務使用了太多的CPU時間,低優先級的任務可能就沒有足夠的時間執行,這就是所謂的線程饑餓。將受影響的任務的優先級提高,確實可以改善問題,但違背了使用優先級的意義。相反,高優先級應該保留給可預測、循環執行、且循環周期較短的任務。對于高優先級、CPU占用時間長的任務應該拆分為多個任務,縮小時間關鍵代碼,通過任務同步機制,將占用CPU時間多的工作交給中或低優先級任務處理。

2、抖動

周期性執行的任務,隨機發生的延遲時間叫做抖動。雖然輕微的抖動很難避免,但是抖動太嚴重就會導致性能變差,間歇性的數據丟失。例如,每隔5ms調整電機的控制參數,如果控制任務的抖動過大就會使得控制性能就變差。除了線程饑餓會導致抖動之外,RTOS系統配置也會有影響,例如系統節拍定時器節拍頻率。理想情況下,兩個節拍之間的時間應該比系統中最頻繁任務的周期時間短得多。

3、優先級反轉

具有固定優先級調度程序的 RTOS 的核心思想是,應該在具有較低優先級的任務之前安排高優先級任務執行。但是當兩個或多個任務需要協調使用全局數據區等共享資源或外圍設備時,可能會導致低優先級的任務先執行,優先級反轉的問題就發生了。出現優先級反轉的現象是系統可能暫時失去響應,導致隨機崩潰。使用RTOS優先級繼承機制,如互斥信號量,可以降低優先級反轉帶來的影響,但要完全消除需要在設計時避免。

4、死鎖

任務突然停止執行,但當前并沒有更高優先級任務在執行,這時可能就發生了死鎖。當兩個或多個應用程序任務阻塞在一起等待對方時,導致任務都無法繼續進行,就會發生死鎖。只能在設計時避免死鎖的發生,例如所有的任務都按照固定的順序使用共享資源,或者同一時間任務不持有多個共享資源,使用超時機制,以及服務器任務專門用于共享資源的訪問等。

5、內存泄漏

通常不建議在嵌入式軟件中進行動態內存分配,但有時會出于各種原因需要進行動態內存分配。問題在于,如果使用它,則必須確保一旦內存塊不再使用時,釋放每個已分配的內存塊。如果在某些情況下遺漏了釋放操作就會出現內存泄漏,并最終耗盡內存導致嚴重錯誤。

 

RTOS調試手段

上面列舉了多任務系統設計開發時比較典型的幾種bug,它們都有一個特點,就是通過閱讀源代碼或者傳統的調試手段很難發現這一類的問題。通常對RTOS系統設計有著豐富經驗的開發者,通過測試和基礎的調試獲得的信息也能夠定位到問題所在,即便如此,分析問題的效率也十分低下。

1、IDE的RTOS調試插件和RTOS自身調試特性

RTOS可能會自帶一些調試功能,用于觀察系統任務的情況,比如任務優先級,當前的任務狀態和堆棧使用情況等。下圖是FreeRTOS通過開啟調試功能后調用vTaskList() API函數獲取的任務狀態信息。使用一個精度比系統節拍高得多的定時器,FreeRTOS還可以分析任務的執行時間信息。

 

一些IDE中支持RTOS內核識別調試插件,例如IAR EWARM支持μC/OS、FreeRTOS、embOS、ThreadX等在內的眾多RTOS。Eclipse中的Code Confidence Tools for FreeRTOS。下圖是IAR EWARM的μC/OS-III調試插件顯示的內核和任務的各項信息,例如堆棧使用,CPU使用率等。

11.png

2、RTOS跟蹤和可視化分析工具

可以發現不論是RTOS自帶的一些調試功能,還是IDE提供的調試插件,雖然能顯示系統中任務的一些信息,但如果要作為一個bug分析工具,其功能還是非常有限。我們只能知道暫停運行的這一刻任務的信息,并不清楚任務的狀態是何時及何原因而改變,更不清楚各個任務之間的交互關系。

更進一步,雖然設計的系統沒有明顯的問題,但是出于低功耗和性能調優的原因需要優化系統的設計,減少不必要的任務切換,降低消息或者信息的阻塞時間等,現有的這些工具和方法已經顯得力不從心。這說明之前的開發工具已經跟不上現在的需求了,這需要從更高層級的系統視圖,觀測和跟蹤系統的運行。

現在很多的RTOS都自帶跟蹤接口,例如FreeRTOS、μC/OS-III都提供了跟蹤接口,可以支持Tracealyzer和SystemView等RTOS可視化分析工具。Linux系統可用LTTng內核事件跟蹤組件。借助這些可視化的OS事件記錄和分析工具,可以極大提升bug的查找效率,還能快速驗證系統設計是否如期,性能是否達標。

以Tracealyzer為例,它可以實時記錄RTOS運行時的各種系統事件,例如任務的調度,任務與任務之間、任務與中斷之間的通信等,以此分析出系統在運行期間的行為,并通過圖形或文件可視化提供給開發人員直觀的查看,可以很快的發現傳統調試中難以捕捉的系統層級的行為。以前面提到的RTOS系統常見的bug之一的優先級反轉為例,使用Tracealyzer的執行實例視圖,開發者立刻就能發現問題。

22.png

再比如抖動的問題,Tracealyzer通過記錄任務執行的時間,在以時間為坐標的圖上很快可以發現抖動很大的執行實例,假如這是對抖動敏感的任務,這可能就是導致系統問題的原因了。

33.png

對于任務與任務、任務與及中斷之間的通信,Tracealyzer能夠繪制完整的通信流圖,如果系統中數據流出現問題,在此圖中一眼就能識別。

44.png

事件記錄以時間戳排序,文本方式記錄了運行期間系統產生的各系統事件(如任務調度、通信、動態內存分配)和用戶自定義事件(類似于printf功能,可以被記錄并顯示在各對應的視圖中)。

55.png

除了Tracealyzer以外,RTOS跟蹤和分析工具還有SEGGER公司推出的SystemView。該工具也提供了多個視圖,包括時間軸,顯示任務和中斷的執行記錄,事件記錄和CPU負載等。

66.png
77.png

它們的工作方式也都相似,有一個用于事件跟蹤的庫,需要與項目一起構建,在目標系統中運行。在運行期間記錄RTOS的各個事件并存儲到位于RAM的事件緩存中,待系統停止運行后讀取出來加載到位于PC端的分析軟件中,通過各種視圖窗口顯示出來。這種工作方式一般稱為快照模式。

快照模式受限于芯片可用的RAM空間,一般記錄的時間比較短。需要長時間記錄,則可以使用數據流模式,通過調試接口和調試器(J-Link)或者串口等通信接口,實時的將數據傳輸到PC端的分析軟件,實現長時間的實時跟蹤和分析,只有電腦的硬盤空間足夠,記錄就可以一直持續。

以上只是簡單展示了RTOS分析工具的用途,它可以彌補現有的開發工具不足以滿足基于RTOS的嵌入式軟件的開發,對于bug的查找很有幫助。對于想要深入學習RTOS的工作機制的開發者,這也是一個很好的輔助工具。不過Tracealyzer和SystemView是商用軟件,商用時需要付費,但SystemView用于教育和評估是完全免費的。另外之前Micrium公司開發的μC/Probe,現在已經可以免費使用,能用于μC/OS-III和FreeRTOS的系統信息觀察,雖然沒有記錄和跟蹤的功能,但是它提供了類似工業組態軟件的圖形控制,功能也很強。

88.png 99.png

北京麥克泰技術

回復評論 (15)

沙發 Jacktang

2021-4-28 22:21

這種RTOS系統,主要是模塊多,多任務系統,主要是調配各種優先級,高優先級的任務使用了太多的CPU資源,對開發調試都是挑戰

板凳 freebsder

2021-4-28 22:33

想要個盜版tracer試試呀。。。

默認摸魚

4樓 w494143467

2021-4-29 10:52

RTOS比裸編更有優勢,隨之來的開發難度自然會越大,不過困難越大越有動力啊!

5樓 MamoYU

2021-4-30 10:12
引用: freebsder 發表于 2021-4-28 22:33 想要個盜版tracer試試呀。。。

ahhhhh,tracealyzer有免費試用版,要不去申請個玩玩?

北京麥克泰技術

6樓 freebsder

2021-4-30 21:34
引用: MamoYU 發表于 2021-4-30 10:12 ahhhhh,tracealyzer有免費試用版,要不去申請個玩玩?

試用的就算了,要是搞出興趣了又不能繼續用,這叫人捉急

默認摸魚

7樓 Albert.G

2021-5-6 16:30

學到了,先收藏了,以后有空留著慢慢看。

8樓 MamoYU

2021-5-7 15:44
引用: Albert.G 發表于 2021-5-6 16:30 學到了,先收藏了,以后有空留著慢慢看。

好的,感謝支持

北京麥克泰技術

9樓 育輝電子

2021-5-13 11:52

支持

10樓 中國商風

2021-6-10 08:46

先收藏了,以后有空留著慢慢看。

11樓 MamoYU

2021-6-17 10:49
引用: 中國商風 發表于 2021-6-10 08:46 先收藏了,以后有空留著慢慢看。

感謝支持~

北京麥克泰技術

12樓 老北京lbj

2021-6-28 16:47

進收藏夾吧,最近在研究RTOS

13樓 中國商風

2021-7-2 08:27

先收藏了,以后有空留著慢慢看,向大神致敬

14樓 hungyu36

2021-8-24 14:47

支持!支持!

15樓 royal90

2021-8-25 16:25

感謝,支持樓主。

16樓 maomao2233

2021-8-28 19:15

不明覺厲 支持支持

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 京公網安備 11010802033920號
    我也要說兩句
    發送
    評論
    萝卜大香蕉