这是我们STEP BY STEP开发一个RISC-V仿真器的第一篇。常见的RISC-V仿真器很多都是基于支持JTAG接口的接口芯片比如FTDI的芯片加上开源OpenOCD实现的。但是接口芯片可能不能满足一些灵活的需求,所以我们可以基于通用MCU去替代类似FTDI的接口芯片,即基于MCU去实现硬件适配器,上位机还是基于OpenOCD。所以我们实际就是实现一个类似xx-LINK的硬件。主要有两部分工作,硬件部分实现JTAG的协议实现和上位机OpenOCD的通讯,上位机部分基于OpenOCD增加支持我们自己的硬件的驱动,后续还可以扩展我们自己的一些自定义功能,比如下载等。首先我们来了解下OpenOCD的开发环境搭建,主要是其源码构建过程和源码仿真。
构建工具
-GCC/Clang
-make
-libtool
-pkg-config >= 0.23 /pkgconf
以下从git构建需要,会自动拉取
-jimtcl 属于git子模块,自动获取
- autoconf >= 2.69
- automake >= 1.14
- texinfo >= 5.0
script checkpatch需要
- perl
- python
- python-ply
适配器驱动依赖
- libusb-1.0 USB接口的适配器
- libftdi USB-Blaster/ASIX Presto/OpenJTAG接口适配器
- HIDAPI CMSIS-DAP
- libgpiod linuxgpiod
- libjaylink J-Link
- capstone ARM反汇编
下载源码
git clone git://git.code.sf.net/p/openocd/code openocd
cd openocd/
git pull
构建过程
./bootstrap
./configure
make
sudo make install
默认安装于`/usr/local/bin', `/usr/local/lib'
输入openocd查看信息
lhj@lhj:~/openocd$ openocd
Open On-Chip Debugger 0.12.0+dev-00574-g2c8376b79 (2024-05-11-22:44)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
embedded:startup.tcl:28: Error: Can't find openocd.cfg
in procedure 'script'
at file "embedded:startup.tcl", line 28
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Error: Debug Adapter has to be specified, see "adapter driver" command
embedded:startup.tcl:28: Error:
in procedure 'script'
at file "embedded:startup.tcl", line 28
lhj@lhj:~/openocd$
基于MSYS2进行,MSYS2的安装不再赘述,假设已经设置好环境变量命令行可以直接使用。Openocd构建和Linux下基本一致。
参考https://openocd.org/doc-release/README.Windows
打开MSYS2 MINGW64
sudo apt install pacman
更新系统pacman -Syuu
安装依赖
pacman -S libtool autoconf automake texinfo pkg-config make autogen git unzip bzip2 base-devel
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-x86_64-libftdi
pacman -S mingw-w64-x86_64-libusb
pacman -S mingw-w64-x86_64-libusb-compat-git
pacman -S mingw-w64-x86_64-hidapi
pacman -S mingw-w64-x86_64-arm-none-eabi-gcc
pacman -S mingw-w64-x86_64-capstone
下载源码
git clone https://git.code.sf.net/p/openocd/code openocd
cd openocd/
构建过程
./bootstrap
mkdir build
cd build
../configure --prefix=/home/qinyunti/openocd/build
make -j4
make install
构建后文件位于build下,tree . -L 2显示如下
qinyunti@lhj MINGW64 ~/openocd/build
$ tree . -L 2
.
├── Makefile
├── bin
│ └── openocd.exe
├── config.h
├── config.log
├── config.status
├── doc
├── jimtcl
│ ├── Makefile
│ ├── _glob.c
│ ├── _initjimsh.c
│ ├── _jsonencode.c
│ ├── _load-static-exts.c
│ ├── _load-static-exts.o
│ ├── _nshelper.c
│ ├── _oo.c
│ ├── _stdlib.c
│ ├── _tclcompat.c
│ ├── _tree.c
│ ├── config.log
│ ├── examples.api
│ ├── glob.o
│ ├── initjimsh.o
│ ├── jim-aio.o
│ ├── jim-array.o
│ ├── jim-clock.o
│ ├── jim-config.h
│ ├── jim-eventloop.o
│ ├── jim-exec.o
│ ├── jim-file.o
│ ├── jim-format.o
│ ├── jim-history.o
│ ├── jim-interactive.o
│ ├── jim-interp.o
│ ├── jim-json.o
│ ├── jim-load.o
│ ├── jim-namespace.o
│ ├── jim-nosignal.o
│ ├── jim-pack.o
│ ├── jim-package.o
│ ├── jim-readdir.o
│ ├── jim-regexp.o
│ ├── jim-subcmd.o
│ ├── jim-win32compat.o
│ ├── jim.o
│ ├── jimautoconf.h
│ ├── jimiocompat.o
│ ├── jimregexp.o
│ ├── jimsh.exe
│ ├── jimsh.o
│ ├── jimtcl.pc
│ ├── jsmn
│ ├── jsonencode.o
│ ├── libjim.a
│ ├── nshelper.o
│ ├── oo.o
│ ├── stdlib.o
│ ├── tclcompat.o
│ ├── tests
│ ├── tree.o
│ └── utf8.o
├── libtool
├── share
│ ├── info
│ ├── man
│ └── openocd
├── src
│ ├── flash
│ ├── helper
│ ├── jtag
│ ├── libopenocd.la
│ ├── libopenocd_la-hello.lo
│ ├── libopenocd_la-hello.o
│ ├── libopenocd_la-openocd.lo
│ ├── libopenocd_la-openocd.o
│ ├── main.o
│ ├── openocd.exe
│ ├── pld
│ ├── rtos
│ ├── rtt
│ ├── server
│ ├── startup_tcl.inc
│ ├── svf
│ ├── target
│ ├── transport
│ └── xsvf
└── stamp-h1
23 directories, 65 files
qinyunti@lhj MINGW64 ~/openocd/build
$
文件浏览器查看文件位于D:\msys64\home\qinyunti\openocd\build\src
使用cmd打开openocd.exe
阅读源码可以使用vscode,
使用vscode打开文件夹D:\msys64\home\qinyunti\openocd
安装c++扩展,其他按需安装
设置vscode默认终端为msys/MinGW32/MinGW64
参考https://code.visualstudio.com/docs/terminal/profiles
创建.vscode文件夹,下面创建settings.json文件
添加以下内容
{
"terminal.integrated.defaultProfile.windows": "MINGW64",
"terminal.integrated.profiles.windows": {
"MINGW64": {
"path": "D:\\msys64\\msys2_shell.cmd",
"icon": "terminal-cmd",
"args": [
"-defterm",
"-mingw64",
"-no-start",
"-here"],
"env": {
"CHERE_INVOKING": "1",
"MSYSTEM": "MINGW64"
}
}
},
}
Terminal-> New Terminal,打开的就是MINGW的终端
可以在终端下make
cd build
make
运行gdb
gdb -f bin/openocd.exe
打开源码界面
layout src
在main处打断点:b main
运行到断点处:r
单步运行:s
查看调用栈:bt
可以配置.vscode下的launch.json和tasks.json,配置使用vscode菜单编译和调试,本质和上述使用命令行一样,直接使用命令也行。
另外运行是参数-dx可以指定,打印输出日志等级,比如
.\openocd.exe -d4 通过打印更多的信息来进行调试
以上体验了openocd的构建,以及在windows下的开发环境搭建,可以进行源码构建和debug为我们后面的开发做准备。