3. 通过GDB读取RISC-V SoC的寄存器和内存
任务目标
通过JTAG接口连接HiFive1 Rev B开发板(FE310 SoC),配置OpenOCD作为调试桥接器,最终建立GDB会话并验证能够读写目标板寄存器与内存。
环境与依赖
- 硬件:HiFive1 Rev B开发板、Olimex ARM-USB-TINY-H JTAG调试器(或板载FTDI JTAG)
- 软件:OpenOCD(≥0.11.0)、RISC-V GNU工具链(含riscv64-unknown-elf-gdb)、SiFive Freedom E SDK中的BSP(用于板级配置)
- 连接:JTAG调试器连接开发板4-pin JTAG接口(TCK/TMS/TDI/TDO),USB连接主机
OpenOCD配置与启动
HiFive1 Rev B使用FE310 SoC,其JTAG TAP符合RISC-V Debug Module规范。OpenOCD需加载SiFive的板级配置。创建以下配置文件hifive1.cfg:
# 接口配置:使用Olimex USB-TINY-H
source [find interface/ftdi/olimex-arm-usb-tiny-h.cfg]
# 传输协议:RISC-V Debug Module要求JTAG
transport select jtag
# 目标芯片:FE310 SoC
source [find target/sifive-fe310.cfg]
# 板级初始化:复位配置与时钟
adapter speed 1000
reset_config srst_n_trst_and_srst
启动OpenOCD(终端1):
openocd -f hifive1.cfg
预期输出(示例,非实测):Info : Listening on port 3333 for gdb connections,表明GDB服务器已就绪。
GDB连接与验证
终端2中启动GDB并连接(需先编译任意测试程序,此处以空程序为例):
riscv64-unknown-elf-gdb
(gdb) target extended-remote :3333
(gdb) info registers
(gdb) x/4wx 0x20000000 # 读取FE310 GPIO0基址处4个字
验证通过条件:
info registers能显示pc、sp等核心寄存器值(非全零或全F);x/4wx 0x20000000能返回4个32位数值,且无Cannot access memory错误;- 执行
load命令可将编译好的ELF烧录至Flash并复位运行。
常见问题
- 连接失败:检查JTAG线序(TCK→TCK,TMS→TMS等),确认开发板供电(5V USB)且
dmesg能看到USB设备。 - 速度过高:若出现
JTAG-DP STICKY ERROR,将adapter speed降至500或200。 - 复位配置错误:HiFive1 Rev B的复位信号为低有效,若复位失败尝试
reset_config srst_n_push_pull。
本案例仅覆盖调试链路建立与基本读写验证,不涉及程序烧录后的业务逻辑调试。若需完整烧录流程,需在GDB中执行load并配合monitor reset halt。