1. 程式人生 > >嵌入式系統除錯(一)

嵌入式系統除錯(一)

前言: Android開發時,有了adb,就能在PC Shell或者Eclispe Debug視窗看到除錯資訊從而定位Bug。Android系統提供的除錯手段很強大,Linux也是,但是對沒有移植這些成熟的嵌入式系統開發板來說,實現嵌入式系統的除錯,從工具到方式,都需要自己動手搭建。一套除錯環境包括:

  • 上位機軟體:比如串列埠除錯助手,secureCRT
  • 除錯介面:比如UART,SPI, I2C
  • 除錯資訊:比如核心資訊,應用程式資訊

除錯資訊的傳送

核心執行產生的資訊,通過printf函式輸出到一個虛擬檔案,再通過讀取檔案獲得這些資訊。所以檔案讀寫,就是嵌入式系統除錯的“傳送門”。但檔案讀寫必然會降低速度,影響核心和驅動效能。因此,程式裡的print都會通過#if

#endif 在編譯時判斷生成的是Debug版本,還是Release版本。通常,printf除錯資訊時還會附加上時間,程序,執行緒,優先順序等附加資訊便於分析。在核心中實現print函式時,也#define了Log的優先順序 。

檔案讀寫只是最簡單最基本的除錯手段,而像Android的adb,Linux的gadb,還能夠實現斷點、單步跟蹤、堆疊分析、CPU效能分析等功能。只是這種強大的除錯工具開發起來,也就不僅僅是向記憶體中讀寫檔案,巨集定義幾個優先順序就可以實現的。參考[5]中簡單介紹了兩種成熟的除錯方案設計的方式,涉及硬體除錯電路的設計和外接輔助除錯裝置。但無論adb還是gadb,都是從三個角度設計:

  1. PC上通過adb跟蹤除錯
  2. 嵌入式上執行adbserver
  3. adb和adbserver有規範的通訊協議,通訊方式可以選擇無線或有線

實時嵌入式作業系統的原始除錯方式

對於實施嵌入式作業系統,因為中斷和任務搶佔機制,單步、斷點等方式是行不通的,會影響到其它現成正常執行的訊號量。除錯需要頻繁修改,編譯程式。一個大點的工程編譯、燒錄到Flash會耗費老多時間。原始除錯方式降低30%生產力。

通用嵌入式作業系統的先進除錯方式

IAR+JLINK、adb

其它

參考[4]中介紹了6種嵌入式(手機、平板)除錯的手段,其中控制檯資訊重定向(到檔案),UART+secureCRT,adb(USB或Wifi)都是我常用的。然而,還可以通過JTAG+trace32直接檢視暫存器或記憶體,dump整個記憶體+trace32…

如果Linux下有gdb這樣的除錯工具,rtos上一定也存在,找到這樣的開源庫,交叉編譯得到可以在開發板上執行的除錯工具(除非記憶體和flash充足)
可以將類似的gdb,gdbserver分開

參考資料