如何使用Terapines ZCC工具链编译运行调试芯来科技RISC-V内核

一、下载安装兆松科技工具链和芯来sdk和openocd

  1. 浏览器输入https://www.terapines.com/ 进入兆松科技官网


    点击DOWNLOAD ZSTUDIO LITE,可以跳转到兆松科技工具链产品下载页面,或者是点击TRY ZSTUDIO CLOUD,体验兆松科技云端版本工具链产品

  2. 在产品下载页面可以下载Ubuntu版本和Windows版本的产品,点击对应版本的产品下载即可,同时还提供了用户手册,可以让用户更加深入的了解兆松科技产品的使用,接下来我们以Ubuntu22版本的ZStudio产品介绍如何在Linux命令环境下快速使用兆松科技的工具链产品快速上手编译芯来科技的sdk。

  3. 下载好ZStudio后解压,在ZStudio安装路径下存在 zstudio-ubuntu22/resources/app/resources/toolchains/zcc文件夹,里面存放的就是兆松科技的工具链

  4. 接下来我们下载芯来科技提供的openocd工具和sdk,openocd下载地址:DOCS & TOOLS_Nuclei-Best RISC-V Processor IP sdk下载地址:GitHub - Nuclei-Software/nuclei-sdk: Nuclei RISC-V Software Development Kit 下载芯来sdk

二、添加环境变量和编译

  1. 下载好芯来sdk后我们在命令行导入ZCC工具链的环境变量如:export PATH=$PATH:/you path/zstudio-ubuntu22/resources/app/resources/toolchains/zcc/bin

  2. 下载好芯来sdk后我们在命令行导入ZCC工具链的环境变量如:export PATH=$PATH:/you path/zstudio-ubuntu22/resources/app/resources/toolchains/zcc/bin

  3. 如果我们此时直接进入application目录中的任意一个demo目录去执行

make CORE=n300 TOOLCHAIN=terapines
  1. 命令编译芯来n300芯片内核程序会出现如下错误:

  2. 所以我们需要在sdk根目录查找并修改名为terapines.mk的文件


    将5处“-lclang_rt.builtins_size”改为“-lclang_rt.builtins”

  3. 随后我们进入目标编译程序目录(以helloworld程序为例进入application/baremetal/helloworld目录)执行

make CORE=n300 TOOLCHAIN=terapines

会编译出helloworld.elf程序


可以看到,我们已经将程序编译成功。
当然您也可以在sdk根目录下使用 git checkout remotes/origin/develop 切换到开发分支这样就可以让您在导入兆松科技工具链环境后直接执行编译命令,可以省去小步骤5
我们后面使用芯来openocd与兆松科技工具链里面提供的zdb进行程序的下载与调试

三、运行

  1. Ctrl + Alt + t,起一个终端,导入先前下载好的芯来科技openocd可执行文件的环境变量
export PATH=$PATH:/you path/nuclei-openocd-2024.02.28-linux-x64/Nuclei/openocd/2024.02.28/bin

在SDK根目录中使用find -name *.cfg命令查找openocd启动配置文件


由于我们使用的是DDR200T的FPGA,下载芯来n300的IP核,所以我们选择openocd_evalsoc.cfg文件启动openocd

  1. 获取openocd_evalsoc.cfg文件的绝对路径,开发板Jtag连接电脑,在导入openocd环境的命令行中使用如下命令启动openocd
openocd -f /you path/nuclei-sdk/SoC/evalsoc/Board/nuclei_fpga_eval/openocd_evalsoc.cfg


如上图,openocd启动成功

  1. 随后我们进入sdk 的application/baremetal/helloworld目录,使用命令
zdb -o "gdb-remote localhost:3333" -o "load" -o "b main" -o "c" helloworld.elf

用zdb连接openocd,并使用load指令将helloworld程序加载到开发板,并在main函数处打一个断点,而后执行,并停止在断点处。我们输入“c”指令,回车即可执行程序。

  1. 最后我们可以任意使用一款串口工具查看程序输出结果,输出如下:

  2. 当然我们在sdk根目录执行

make CORE=n300 TOOLCHAIN=terapines

命令后会编译出helloworld程序这是由于在sdk根目录的Makefile指定了helloworld程序


如果你想在sdk根目录编译其他的程序可以修改sdk根目录的Makefile也可以进入到对应的目录去执行编译相应的application

四、调试

我们在运行步骤中使用命令

zdb -o "gdb-remote localhost:3333" -o "load" -o "b main" -o "c" helloworld.elf

将程序下载到开发板运行,您可以才分命令来看,“gdb-remote localhost:3333”是在zdb中连接openocd,只有load指令将程序加载到开发板中运行,而后使用“b main”命令将程序断点打在main函数处,随后使用“c”命令继续执行程序运行,接下来我么将演示如何使用zdb调试程序断点查看变量。

  1. 使用"zdb ./helloworld.elf"命令启动zdb并加载到zdb

  2. 在zdb中使用“gdb-remote localhost:3333”命令让zdb连接openocd,

  3. 使用“load”命令将可执行程序从zdb加载到开发板

  4. 在main函数处打断点,使用“b main”命令

  5. 输入“c”命令


    此时程序断点停留在main函数处

  6. 输入命令“n”进行单步调试


    可以看到程序从100行调到101行执行

  7. 将调试断点定在main.c文件的110行使用“b main.c:110”,并使用“print rval”命令查看109行rval变量的值。


    可以看到rval的值为uint32_t类型1629638330

  8. 您可以使用“register read”命令查看各个系统寄存器的值

2 Likes