参考资料
jlink使用的是博光微的jlink v9
树莓派使用的是4b
jlink与树莓派链接
按照表中的内容进行链接,注意链接过程要小心仔细,否则后续排查起来十分麻烦
下载openocd
由于我是在linux环境下,所以省去了jlink的驱动安装,直接先下载openocd
sudo apt install openocd
注意不要去openocd的官网下载最新源码安装,2024/9/24时尝试的版本就已经链接不上本jlink了。在ubuntu22.04管理的openocd的版本可以正常使用。
树莓派设置
修改config.txt
kernel 的设置是由于使用笨叔的bin,这里可以是其他的bin,不一定是loop.bin
[pi4]
kernel=loop.bin[pi3]
kernel=loop.bin[all]
dtoverlay=pi3-miniuart-bt # 使用的是UART0,需要关闭蓝牙
arm_64bit=1 #enable 64bit image
enable_uart=1 #enable pl uart
uart_2ndstage=1 #enable FW debug infoenable_jtag_gpio=1
gpio=22-27=a4
init_uart_clock=48000000
init_uart_baud=115200#kernel_old=1 # if we set it, the image will be load at 0x0, otherwise the 64bit image will be load on 0x80000
#disable_commandline_tags=1 #Fix me, when set it, the image will be load on 0x0 ?
jlink链接到openocd
下面是几个配置文件
jlink.cfg
#
# SEGGER J-Link
#
# http://www.segger.com/jlink.html
#
adapter driver jlink
# interface jlink# The serial number can be used to select a specific device in case more than
# one is connected to the host.
#
# Example: Select J-Link with serial number 123456789
#
# jlink serial 123456789
raspi4.cfg
set _CHIPNAME bcm2711
set _DAP_TAPID 0x4ba00477adapter speed 1000transport select jtag
reset_config trst_and_srsttelnet_port 4444# create tap
jtag newtap auto0 tap -irlen 4 -expected-id $_DAP_TAPID# create dap
dap create auto0.dap -chain-position auto0.tapset CTIBASE {0x80420000 0x80520000 0x80620000 0x80720000}
set DBGBASE {0x80410000 0x80510000 0x80610000 0x80710000}set _cores 4set _TARGETNAME $_CHIPNAME.a72
set _CTINAME $_CHIPNAME.cti
set _smp_command ""for {set _core 0} {$_core < $_cores} { incr _core} {# cti create $_CTINAME.$_core -dap auto0.dap -ap-num 0 -ctibase [lindex $CTIBASE $_core]cti create $_CTINAME.$_core -dap auto0.dap -ap-num 0 -baseaddr [lindex $CTIBASE $_core]set _command "target create ${_TARGETNAME}.$_core aarch64 \-dap auto0.dap -dbgbase [lindex $DBGBASE $_core] \-coreid $_core -cti $_CTINAME.$_core"if {$_core != 0} {set _smp_command "$_smp_command $_TARGETNAME.$_core"} else {set _smp_command "target smp $_TARGETNAME.$_core"}eval $_command
}eval $_smp_command
targets $_TARGETNAME.0
树莓派上电,并在上述两个文件目录下执行
openocd -f jlink.cfg -f raspi4.cfg
即可看到下面的输出,就是正常的启动了
启动gdb调试
telnet服务
新起一个终端,登录openocd的telnet服务
telnet local host 4444
在telnet服务中继续执行
halt
load_image /home/alan/Project/learn/arm64/BenOS/benos.bin 0x80000
step 0x80000
使用gdb进行调试
创建.gdbinit
文件
target remote localhost:3333
再执行
gdb-multiarch --tui build/benos.elf
即可进入gdb调试。
但是发现一个问题,必须得重新上电才能使断点生效,否则只能n或者s,使用c就会报错未知的断点。有没有大佬解决过这个问题。