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个字

验证通过条件:

  1. info registers能显示pc、sp等核心寄存器值(非全零或全F);
  2. x/4wx 0x20000000能返回4个32位数值,且无Cannot access memory错误;
  3. 执行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。