剛開始接觸嵌入式硬件時只知道寫程序,覺得調試根本不需要,隨著時間的積累和問題復雜度的提升,才發現調試對于一個系統的重要性。
生活中很多這樣的例子,調試,永遠都是事物良性發展過程中必不可少的一個環節,兩個人過日子遇到了矛盾,靜下來溝通就是調試,總不能一言不合就分手。在設計一個產品或者一個流程時,都要充分的考慮到調試因素,這樣系統在運行過程中一旦出現了問題,可以及時的追溯。
OpenOCD就是這樣一個工具,配合JTAG調試協議,可以對硬件設備進行指令集級別和寄存器級別的調試。
了解一個新軟件最好的方式就是讀官方的Manual。當然,不一定非得從Manual開始,可以從一些實例開始,或者基于母語的博客或者論壇,但想掌握得更徹底,還是得找官方的文檔,解鈴還須系鈴人。如果軟件的設計思想過于復雜,Manual讀一遍是不管用的。往往盤旋式的前進會收到更好的效果,也就是帶著問題讀Manual,解決了問題;再遇到一些問題時,再讀一遍Manual,就這樣反復幾遍也就逐漸掌握了,所謂的一萬小時理論也是基于此。
OpenOCD的優勢就是開源,支持N種調試器。充分的理解和掌握整個開發過程中的調試方法,是項目穩定進行的可靠保障,很多未知問題都得通過底層調試才能分析出來。
調試ARM
linux下使用gdb調試stm32可以使用兩套環境:
- stlink硬件+openocd軟件+arm-none-eabi-gdb
- jlink硬件+jlink_gdb_server軟件+arm-none-eabi-gdb
搭建環境
- 通過網站http://www.freddiechopin.info/en/download/category/4-openocd下載openOCD for windows軟件包,現在的版本是0.9.0。如果希望下載源代碼,可以訪問網站http://openocd.sourceforge.net/。
- 登陸網站http://zadig.akeo.ie/下載zadig軟件,用來安裝仿真器的驅動程序,當前版本是2.1.2,說的直白一些openOCD只把Jlink仿真器當作普通的USB設備來使用,不使用Jlink自帶的仿真器驅動程序,如果已安裝了Jlink仿真器驅動程序,這個過程就是把原先的驅動程序換掉。
- 插入Jlink仿真器(如果是第一次插入Jlink仿真器,系統會要求安裝驅動程序,我們可以點擊取消,不必理會),運行zadig軟件。
- 選擇J-Link,然后選擇WinUSB驅動程序,點擊Reinstall Driver按鈕或Replace Driver按鈕,這樣便完成了驅動程序的替換。
- 解壓縮openOCD軟件包,在硬盤上建立openocd文件夾(可寫其它的任意名稱),拷貝bin和scripts文件夾下面的所有文件到該文件夾。
- 使用Jlink仿真器連接目標板,并給目標板上電。
- 在windows運行中輸入cmd,啟動控制臺程序,并切換至步驟7建立的文件夾。
- 輸入命令openocd -f interface/jlink.cfg -f target/k60.cfg,jlink.cfg表示使用jlink仿真器,k60.cfg表示下載k60系列MCU。
- 出現下列界面表示連接成功。
openOCD思考
OpenOCD是一款功能強大的開源調試軟件,支持多種調試器,例如Jlink、STlink、FT2232、并口等;支持多種嵌入式處理器,例如ARM7,ARM9, ARM10, ARM11和Cortex等核心的芯片;另外還提供一個GDB Server接口。
剛一開始可能還摸不清OpenOCD的運作模式,畢竟它不是一款圖形化軟件,而是基于command line 的交互方式。而且OpenOCD運行后直接就是一個Daemon,我第一次運行時還真有點懵。這種軟件還是得靠動手操作實例來掌握。
使用OpenOCD開發項目,我們需要做的不止是將調試器連接到開發板,我們還需要配置OpenOCD讓它知道我們的調試器和開發板的型號,可以使用OpenOCD連接GDB,然后使用例如Eclipse或者其它圖形化的工具。
TAP
Test Access Ports (TAPs) are the core of JTAG. TAPs serve many roles, including:
測試訪問端口TAPs是JTAG的核心,TAPs服務許多角色,包括:
- Debug TargetA CPU TAP can be used as a GDB debug target.
- 調試目標端CPU TAP可以作為GDB調試的目標端程序,即GDBServer。
通俗點講,TAP就是一個調試鏈,通常一個芯片就是一個TAP,但是一個芯片往往包含多個IP核,比如,ARM+DSP或者ARM+FPGA或者ARM+ASIC,所以在這個chain里面通常會包含多個可調試對象,比如使用scan_chain命令顯示的信息,可以看到omap5912下面包括3個可調試成員。
OpenOCD啟動時將配置文件作為參數.
openocd.exe -f jlink.cfg -f openocd-ralink.cfg 命令就是將jlink.cfg和openocd-ralink.cfg兩個配置文件作為配置參數。
怎么學openOCD
其實也很簡單。首先弄明白了原理,知道openOCD是搞毛線用的。
然后,知道怎么搭建環境。比如需要什么硬件J-Link,什么軟件openOCD,zadig等。
環境搭建好以后,知道如何輸入命令來和目標機連接。
知道openOCD的常用命令,知道如何分析和更改配置文件。
知道如何配合gdb進行調試。
如果以上都搞定,那么我就認為,openOCD已經盡在掌握中,剩下的就是不斷嘗試和完善自己的openOCD的知識體系結構了。
對比JLink驅動
通過上面的學習,我們可以看到openOCD只把Jlink仿真器當作普通的USB設備來使用,不使用Jlink自帶的仿真器驅動程序。也即是說:openOCD替代了jlink驅動提供的功能。
我們知道JLink驅動提供給了我們使用命令下載bin文件,運行bin文件,以及調試bin文件等功能。那么openOCD呢?說實話,我還沒用過呢......O(_)O哈哈~
出差必備
買火車票、高鐵票、機票,訂酒店都打9折的出行工具TRIP,點擊注冊