RV-LINK:用RISC-V开发板做RISC-V仿真器
RV-LINK v0.1 已经发布:https://gitee.com/zoomdy/RV-LINK/releases
用基于RISC-V的MCU开发板来实现RISC-V的仿真器,取名RV-LINK。(2019-09-27)用 GD32VF103C-START 和 Longan Nano 实现了调试功能,可以调试 GD32VF103。
https://blog.csdn.net/zoomdy/article/details/100057361
zoomdy at 163 dot com
项目主页
https://gitee.com/zoomdy/RV-LINK
特性
- 使用市面上现有的 RISC-V 开发板实现 RV-LINK 仿真器,作为 RV-LINK 的开发板要能够支持 USB Device。
- Longan Nano 开发板,淘宝有售
- GD32VF103C-START 开发板,淘宝有售
- RV-LINK 通过 USB 导出虚拟串口,串口实现 GDB Remote Serial Protocol 协议,使 RV-LINK 作为 GDB Server 直接与 GDB 连接;
- 目标端支持 JTAG 接口。
- 目标端支持兼容 RISC-V Debug spec 的 RISC-V 处理器。
- 不需要 OpenOCD 之类的软件,RV-LINK 直接与GDB对接,这是RV-LINK的显著特征,没有为什么,就是想完全用 RISC-V 来实现一个完整的仿真器。
- 支持任务感知(task-aware、OS-aware),陆续添加主流RTOS的任务感知。
设计
- host,主机接口:USB,实现虚拟串口。
- link,仿真器本身,使用任意一款支持USB Device 的 RISC-V开发板,已经在 GD32VF103C-START 和 Longan Nano 这两款板子上实现基本功能。
- target,目标处理器,兼容 RISC-V Debug spec 的 RISC-V 处理器,已经支持的 RISC-V:
- GD32VF103V。
- jtag,JTAG 接口:标准 JTAG 接口实现,使用 I/O 模拟,或其它专用外设实现(例如SPI?)
- 系统组件
- 使用 Protothreads。
- link 组件,与仿真器硬件密切相关,包括 USB Device 驱动,JTAG 接口驱动。link 组件要提供抽象接口,允许支持多种 link 硬件。源代码中包含多个 link 的支持,编译时通过配置选择一个。
- usb serial 组件,与硬件无关的虚拟串口。
- gdb-server 组件,实现GDB Remote Serial Protocol。
- target 组件,与目标处理器密切相关,包括 Flash 烧录算法。target 组件要提供抽象接口,允许支持多种target 组件。源代码中包含多个 target 的支持,编译时通过配置选择一个系列。
- task-aware 组件,任务感知组件。task-aware 组件要提供抽象接口,允许支持多种 RTOS。源代码中包含多个 task-aware 的支持,编译时通过配置选择一个或多个。低优先级。
- usb-storage 组件,优盘拖文件形式下载目标固件。低优先级。可以升级RV-LINK固件,也可以升级目标板固件。默认情况下升级目标板固件,优盘名称包含目标板处理器型号,通过设置RV-LINK后,可以升级RV-LINK自身的固件,此时优盘名称为RV-LINK。
- GD32VF103 支持 USB DFU 升级固件。
- gprof-catch 组件,定时获取 target 的 pc 寄存器,生成 gprof 文件,作为性能分析。低优先级。
- var-view 组件,不停机察看 target 变量。低优先级。
- trace 组件,软 trace 输出,target 通过该接口输出 trace 信息。低优先级。
- 工作模式
- emulator 模式:与GDB连接,调试时使用。
- profiler 模式:串口输出 gprof 输出文件,代码覆盖分析、性能分析时使用。
- 开发环境
- 构建工具:Makefile 做构建,独立于IDE。
- 主机:优先支持 Linux,支持 Windows
- 编译器:gcc
- 集成开发环境:Eclipse,任意版本
- 辅助程序
- 提供图形用户界面
- 自动查找连接到电脑上的 RV-LINK
- 根据用户选择的 link、target、os自动生成 RV-LINK 固件,并下载到 RV-LINK,也包括其它的可选项
- 察看 RV-LINK 状态,修改 RV-LINK 配置
- 辅助程序是可选的,在没有辅助程序的情况下,使用虚拟串口完全可以实现所有功能
实施
- GD32VF103C-START已经到货,GD32VF103V_EVAL刚下单(2019-09-02)。
- 在Xubuntu 16.04环境下配置了GD32VF103C-START开发环境:Eclipse CDT 在Marketplace 搜索安装 GNU MCU Eclipse 插件,OpenOCD和GNU工具链使用芯来网站下载的版本。OpenOCD 的配置脚本从 Windows 版的NucleiStudio_IDE提取,文件名是
openocd_gdlink.cfg
。或者从下文的资料中拷贝。 - GD32VF103C-START USB转串口 Demo 运行成功(2019-09-01)。
- GD32VF103C-START JTAG 接口,读取K210的idcode和dtmcs成功(2019-09-02)。
- 用 GD32VF103C-START 和 Longan Nano 实现了调试功能,可以调试 GD32VF103(2019年9月25日)。
资料
openocd_gdlink.cfg
adapter_khz 1000
reset_config srst_only
adapter_nsrst_assert_width 100
interface cmsis-dap
transport select jtag
autoexit true
set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x1000563d
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAME
$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size 20480 -work-area-backup 0
# Work-area is a space in RAM used for flash programming
if { [info exists WORKAREASIZE] } {
set _WORKAREASIZE $WORKAREASIZE
} else {
set _WORKAREASIZE 0x5000
}
# Allow overriding the Flash bank size
if { [info exists FLASH_SIZE] } {
set _FLASH_SIZE $FLASH_SIZE
} else {
# autodetect size
set _FLASH_SIZE 0
}
# flash size will be probed
set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME gd32vf103 0x08000000 0 0 0 $_TARGETNAME
riscv set_reset_timeout_sec 1
init
halt