嵌入式OS入門筆記-以RTX爲案例:十.Keil的RTX調試支持

原文:http://blog.csdn.net/raym0ndkwan/article/details/38539237

嵌入式OS入門筆記-以RTX爲案例:十.Keil的RTX調試支持

調試(debug)是軟件開發的一個重要環節,對於嵌入式開發而言這個環節其實比較依賴一些硬件資源(硬件debugger)的支持。傳統的嵌入式系統的調試比較依賴斷點(breakpoint)和單步調試(single step through)。而 ARM cortex-M 系列的芯片其實有很強的CoreSight片上調試支持,實際上就是一個小的調試硬件,作爲ARM的標準,內嵌在ARM的芯片裏。在ARM自家的調試器ULINK-pro等的幫助下,可以實現代碼覆蓋率,代碼剖析,代碼性能分析等非常強大的調試功能。不同架構的Cortex-M系列的芯片支持不同的CoreSight部件,詳見官方網站的說明


作爲ARM自家的軟件開發工具,Keil自然也在調試方面有很多相應的支持。我們這裏簡單介紹一下Keil對RTX的支持,操作系統感知調試(OS-aware debugging)。主要有兩個功能,一個是系統和進程觀察窗口(System and Thread Viewer),另外一個是事件窗口(Event Viewer)。

這裏以STM32F4Discovery板作爲例子。

1.系統和進程觀察窗口(System and Thread Viewer)

首先這個功能和其他Cortex-M芯片,查看內存值(Memory Window 或者 Watch window)的運作原理類似,RTOS會把相關的進程信息儲存在內存裏面,然後這個系統和進程觀察窗口就會從這個內存區域裏面提取信息,其他的RTOS開發者也可以利用這個功能。


用法具體說來,非常簡單,首先進入調試模式

然後在View菜單中,確定Periodic Window Update被點選了:

最後,在Debug菜單中的OS Support欄中,點選System and Thread Viewer:


然後就可以看到這個窗口:

這就是系統和進程窗口,裏面提供了RTX系統的基本設置,例如堆棧大小,時間片設置等和進程的基本信息,例如進程ID,進程優先度,當前進程狀態,進程的delay時間,進程等待的事件值和當前的事件值和堆棧的適用程度。這個窗口還會實時更新各個進程的狀態,非常好用。

舉一個簡單的例子,如果所有的進程都處於WAIT_SEM(等待信號量)的狀態,而只有os_idle_demon處於Running狀態,那麼很可能就是進入了死鎖的狀態。調試時可以根據這裏瞭解更多關於進程的實時情況。


2.事件窗口(Event Viewer)

可能在第一步配置系統和進程窗口時很多人都留意到了OS support中的,Event Viewer選項,沒錯,勾選它,就能啓動這個調試功能。但這個調試功能需要SWV(Serial Wire Viewer)的支持。

首先要退出調試模式,然後點選Target Option,選擇其中的Debug 欄目,點選在Debugger選擇欄右側的Settings按鈕:



然後點選裏面的Trace(跟蹤)欄目,開啓Trace,失能Periodic和EXCTRC選項,其餘配置參考下圖:



然後再進入調試模式,運行,就能看到這個事件窗口了:



清晰記錄了具體某一時刻,哪個進程在運行,和進程運行之間的切換。


如果你勾選開啓右上角的3個小功能:Task Info, Cursor和 Show Cycles,然後再把鼠標移至任一進程,就會出現進程信息框:


這些信息包括當前時間片裏,進程開始的事件結束的事件,和該進程最大和最小的一段時間片。最爲重要的是這個Called,這個數據是當前進程運行的次數,也就相當於這個是個profiler的數據,我們可以找出運行次數最高的進程,針對性地去優化程序。


3.其他RTX調試技巧

RTX本身提供了一個功能,能夠返回當前時間(以RTX設置的時間單位爲單位,初始時間是RTX開始Initialize的時間,也就是os_sys_init()的那一刻):

current_time=os_time_get();

通過讀取當前的操作系統時間,也能夠實現一些性能方面的調試功能,但這需要代碼裏面額外寫入這部分相關的調試代碼。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章