前文講到zephyr內核編譯后在stm32-f411re nucleo平臺上運行以及調試,其實除了上文提到的這款st平臺,最新的zphyer sdk已經支持很多種開源硬件開發板,arduino-due就是其中的另一塊.不過與st平臺不同的是,arduino-due并沒有st-link那樣的板載調試器供開發調試,所以調試時需要連接調試器進行調試,本文就介紹如何使用jlink和openOCD來調試運行zephyr內核的arduino-due平臺. 開發環境: Ubuntu-14.04, kernel 4.4.0 arduino-due開發板 segger j-link adaptor. (固件v9.4, clone版某寶采購),支持swd+jtag OpenOCD v1.0版
步驟 如何下載zephyr內核代碼,準備開發環境前文有講述,這里不再詳細敘述,直接進編譯步驟.
step 1: 編譯運行于arduino_due開發版的zephyr內核
執行完環境變量初始化步驟后, 進入到zephyr/samples/hello_world目錄,執行 make BOARD=arduino_due
./outdir/arduino_due/zephyr.bin就是要燒寫進Flash的二進制文件.
step2: 燒寫: 連接host PC和arduino平臺, Micro-B口連接到目標板的PRograming port, 也就是距離電源口近的那個口. 連接后,如果一切順利,/dev/目錄下會生成 /dev/ttyACM0,這個是usb虛擬的串口設備節點. 接著執行下面的命令,設置 ttyACM0設備的波特率為1200, 根據平臺手冊,1200波特率為執行erase flash必須的參數配置.
stty -F /dev/ttyACM0 speed 1200 cs8 -cstopb -parenb
波特率配置成功后,在hello_Word目錄下,執行命令 bossac -p ttyACM0 -e -w -v -b ./outdir/arduino_due/zephyr.bin
進行平臺燒錄, bossac是用于arduion_due的開源燒錄工具, 其代碼可以到github下載: git clone https://github.com/shumatech/BOSSA.git
經過簡單的./configure, make,install后,即可使用. 下圖展示的是燒寫過程:
燒寫完成后,新開一個shell會話,執行 sudo minicom -D /dev/ttyACM0 -o命令連接串口, 然后按平臺復位鍵對平臺進行復位, 便可以在串口終端看到內核的打印輸出:
注意: 使用usb串口看打印,執行燒寫命令時候必須關閉minicom和/dev/ttyACM0的連接,否則會有干擾導致燒錄失敗(“SAM-BA Operation failed”,要避免此問題可以使用usb轉串口的板卡跳線到平臺tx0,gnd,miniCOM連接/dev/ttyUSBx即可(原因可能是原理圖上tx0和 ATMEGA16U2-MU tx是同一個網絡,有沖突).
debug環境搭建:
本文介紹的調試鏈路示意圖如下所示:
先上圖:
關于跳線連接,按照arduino-due原理圖和jlink引腳排布圖逐一連接 tms, tck, tdi, tdo四條線, due的jtag口非常小, 要注意跳線焊接處不要短路. openOCD自帶的jlink.cfg無法直接使用,報錯大部分是因為腳本漏掉某些配置,google了老半天,再加上自己的一些理解, 修改成下面這樣子:
OpenOCD tcl目錄自帶的配置文件jlink.cfg原本只有一行(第7行),一開始時openOCD報告很多error 和warning,后來幾經周折,逐個的去google, baidu找答案,CPU tap配置時考慮到due使用的是sam3x8e主控,看了一下只有target/at91sam3XXX.cfg比較靠譜, 一步步的修改成上圖的樣子,過程不再贅述.
修改完畢后,執行 命令 openocd -f ./interface/jlink.cfg, 如下圖所示,無錯誤無警告, 表示連接成功
新開一個shell, 執行gdb會話, 如下圖的命令序列.
ok,gdb和目標平臺連接成功,此時可以執行基本的gdb命令調試zephyr內核了, 是不是很爽?
arduino_due平臺有上的自帶10 pin的mini jtag connector公口,國內很難找到與之對應的connector, 所以試驗的時候跳了線, swd口和jtag口是復用pin的,本試驗原本打算使用jtag口功能,所以拉了四根主要信號線(TMS,TDO,TDI, TCK), 對應jlink.cfg文件 transport select jtag 后面在gdb調試的時候, 發現jtag連接不是很穩定,openOCD與gdb的連接經常掉線,于是就改jlink.cfg為swd模式嘗試,沒想到這一試結果非常滿意. #transport select jtag transport select swd 現在還不清楚jtag模式為什么不穩定,猜測或許是有些線沒有接上,比如jtag規定的reset, vcc, gnd等等,這也要看tap, 有些主控僅僅接上面4條線即可. swd模式下,需要的引腳數目比jtag要少,主要有兩條 MCU的JTMS/SWDIO接JTAG口的TMS; MCU的JTCK/SWCLK接JTAG口的TCK。 jtag和swd接口這樣的定義,無論是配置采用swd或者jtag模式,都不需要重新跳線,兩種模式切換不依賴硬件電路,非常方便.
發現jlink腳本只要對jlink.cfg稍作修改,注明調試接口,其他配置用 -f 選項再次導入文件.
執行openOCD時候,用-f選項后跟配置文件, 即可在jlink.cfg文件的基礎上再導入額外配置, 變成 openocd -f interface/jlink.cfg -f target/at91sam3XXX.cfg (或者openocd -f interface/jlink.cfg -f board/atmel_sam3x_ek.cfg 導入板級配置文件也可)
openOCD -f 選項可以多次使用,可以使多個的配置文件生效.
openOCD連接成功后,默認情況下并不復位CPU,直接gdb登錄3333端口連接,會出現”WARNING! The target is already running. >All changes GDB did to registers will be discarded! Waiting for target to halt.”警告, 如果想從_reset處從頭開始debug, 可以給利用 >openOCD的 -c 選項發送復位命令給處理器,完整的命令是 openocd -f ./tcl/interface/jlink.cfg -f ./tcl/target/at91sam3XXX.cfg -c >’init’ -c ‘reset halt’, 如果是attach模式,只執行 init, halt 兩個命令就可以了.
ok ,done. J-link接口定義
仿真器端口 | 連接目標板 | 備注 |
---|---|---|
VCC | MCU電源VCC | VCC |
VCC | MCU電源VCC | VCC |
TRST | TRST | Test ReSeT/ pin |
GND | GND或懸空 | |
TDI | TDI | Test Data In pin |
GND | GND或懸空 | |
TMS | SWIO | TMS, SWIO JTAG:Test Mode State pin ; SWD: Data I/O pin |
GND | GND或懸空 | |
TCLK | SWCLK | TMS, SWCLK JTAG: Test Clock pin ; SWD: Clock pin |
GND | GND或懸空 | |
RTCK | RTCK | |
GND | GND或懸空 | |
TDO | TDO | Test Data Out pin |
GND | GND或懸空 | |
RESET | RESET | RSTIN pin |
GND | GND或懸空 | |
NC | NC | |
GND | GND或懸空 | |
NC | NC | |
GND | GND或懸空 |
segger jlink引腳排列:
新聞熱點
疑難解答