Toc
  1. openocd
  2. 场景模拟
    1. 连接openocd
    2. 连接gdb
    3. 自动化配置
    4. 结语
Toc
0 results found
Salieri
openocd+gdb调试指北(riscv)
2020/07/30 Notes linux gdb openocd

openocd

配置好openocd的配置文件
如下所示,更改调试速度,接口类型,usb设备pid等信息。保存为debug.cfg文件

adapter_khz     1000
interface ftdi
ftdi_device_desc "Digilent USB Device"
ftdi_vid_pid 0x0403 0x6014
ftdi_channel 0
ftdi_layout_init 0x00e8 0x60eb
reset_config none
set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAME -coreid 0
gdb_report_data_abort enable
gdb_report_register_access_error enable
riscv set_reset_timeout_sec 120
riscv set_command_timeout_sec 120
riscv set_prefer_sba off
init
halt
echo "Ready for Remote Connections"

使用openocd连接待调试设备

openocd -f debug.cfg

连接上的话终端中会输出下面的内容

Open On-Chip Debugger 0.10.0+dev-00195-g933cb87 (2020-06-15-20:32)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
adapter speed: 1000 kHz
Info : auto-selecting first available session transport "jtag". To override use 'transport select '.
Info : clock speed 1000 kHz
Info : TAP riscv.cpu does not have IDCODE
Info : datacount=2 progbufsize=8
Info : Examined RISC-V core; found 1 harts
Info : hart 0: XLEN=64, misa=0x8000000000141105
Info : Listening on port 3333 for gdb connections
Ready for Remote Connections
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections

连接上openocd之后就可以使用gdb/tcl/telnet调试了,新建一个终端,输入riscv64-unknown-elf-gdb进入gdb。后面我以一个实际应用场景为例来说明。

以上图的内存映射为例,这是一个运行linux的某开源64位riscv处理器。整个系统的boot流程可大致简化为

在这套系统中,bootrom为fpga例化的片内sram,用来存储sd卡拷贝的代码以及linux设备树。而sd卡中存放bootloader以及linux镜像。

场景模拟

我们假定gdb调试需求为,不拷贝sd卡中内容,直接使用gdb把bootloader和linux镜像加载进ddr中,并且替换bootrom中设备树文件。

连接openocd

openocd -f debug.cfg

连接gdb

创建一个新的终端,输入riscv64-unknown-elf-gdb进入gdb。随后在gdb的命令行中经行如下操作

target remote localhost:3333                        ## 连接调试设备
file /folder/filename ## gdb打开要加载的sd卡内容
load ## 把Linux镜像加load进ddr中
layout asm ## gdb终端中显示汇源源码
set $pc=0x10ac8 ## 把pc指针设到需要加载linux设备树的地址
si ## 单步执行
b boot_other_hart ## 在boot_other_hart语句出设置断点
c ## 全速执行,一直执行到断点处
restore /folder/filename.dtb binary 0x81200000 ## 加载设备树文件
c

此段涉及到文件路径,地址等命令都是伪代码,毕竟是实际例子来讲解,各位自行替换。大致理解不同命令起什么作用就行。更多gdb命令请自行查阅相关文档。

自动化配置

除此之外,可能会觉得gdb里面输这么多指令肯定很麻烦。可以新建一个文本文件(如gdbinit),将gdb命令都放进去。
运行gdb时候使用-x参数。

riscv64-unknown-elf-gdb -x /folder/gdbinit

同样的openocd还可以配合telnet等工具使用,各位自行发掘

结语

我写博客主要目的是强化自己记忆力,假使有遇到相同难题,欢迎留言交流。

打赏
支付宝
微信
作者:Salieri
本文基于CC BY-NC-SA 4.0许可协议发布,欢迎转载,演绎,但是必须保留本文署名,且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系