构建,运行,调试
本章将介绍如何使用 ZStudio 进行项目的构建、运行和调试。ZStudio 集成了兆松科技自研的 ZCC 编译器、ZEMU 仿真器以及 ZDB 调试器,为用户提供完整的开发工具链支持。
构建
ZStudio 使用内置的项目文件(.zsproj)对项目进行管理;使用 Make 工具进行构建管理,用户可以通过构建配置窗口配置 Make 工具的构建行为。
本节内容使用 ZSolution 快速上手中的 Quick_Start 项目,用户可以遵循以下步骤构建项目:
-
设置当前活动项目
确认需要构建的项目已设置为当前活动的项目,工具栏中的按钮将基于当前激活项目进行构建、仿真和调试。
-
选择构建版本
工具栏的下拉框可以快捷切换 "Debug"、"Release"、"Min Size" 或 "Release with Debug information" 版本。
-
Debug(调试版):主要用于开发阶段,包含了丰富的调试信息。
-
Release(发布版):主要用于生产环境,不包含调试信息。
-
Min Size(最小尺寸版):点在于减小最终生成文件的大小。
-
Release with Debug Information(带调试信息的发布版):在发布版的基础上,保留了一些调试信息。
-
-
选择构建配置
从构建下拉框中选择
(构建配置)按钮或右键项目节点在上下文菜单中选择"构建配置"进入设置窗口,修改详细构建参数。
构建配置
-
Make:控制 Make 工具的构建行为。
- 打印详细信息:此选项可以控制是否在构建控制台打印详细的构建输出,默认为关闭状态。
- 最大并行任务数:此选项(
-j)可以控制构建过程中可以并行执行的最大任务数,默认为Auto,即根据当前系统的 CPU 核心数自动确定。
-
Arch:用于指定编译器生成适用于哪个目标处理器架构的代码。例如"rvimac"。用户可以从下拉列表中选择
arch或者手动输入指定的arch参数。 -
ABI:用于指定 RISC-V 应用程序二进制接口,例如"ilp32",表示在 32 位系统中,整数、长整型和指针数据类型均为 32 位。
-
CPU:用于启用特定的优化,相当于同时指定 Arch、ABI 和调度模型并且优先级最高。
-
编译器选项允许用户指定编译器参数,例如优化级别和调试级别等。
-
链接器选项允许用户禁用默认的库和起始文件,指定链接脚本等。
-
汇编器选项允许用户指定汇编器参数。
-
NM/Readelf/Objdump/Objcopy/Size工具允许用户启用/禁用输出并控制输出内容。
详细的工具链配置参考配置构建选项小节。
-
-
构建项目
点击工具栏中
按钮开始构建。
-
检查构建结果
开始构建后,底部的构建控制台会自动输出构建日志信息;用户可通过构建控制台的下拉框过滤不同的输出信息。
-
检查生成文件
构建完成后,在解决方案导航或文件导航 output 节点中检查是否生成了项目可执行文件或目标文件。
配置构建选项
用户针对某个项目自定义构建选项,可以右键项目节点在上下文菜单中选择"构建配置"进入设置窗口,进入工具设置(Tool Settings)页面,选择合适的构建选项或添加自定义参数。
-
编译器 > 优化
用户可以在此处修改优化等级,优化选项以及指定项目使用的代码模型等。
-
优化等级:此选项可以控制编译器对其生成的代码的优化程度。用户根据需要在-o0 至-os 中选择合适的优化等级以平衡程序性能和代码大小。
-
代码模型:ZCC 编译器目前支持
medany,medlow选项,在 RISC-V 架构中分别等效于 GCC 编译器的medium,small选项,参考下表。ZCC 编译器支持的 RV32 及 RV64 代码模型 Code Model ZCC GCC text/data/rodata RISC-V 架构 medlow small 整个 RV32 地址空间或 RV64 地址空间最低 2GiB 和最高 2GiB 的范围 RISC-V 架构 medany medium 整个 RV32 地址空间或 RV64 地址空间基于当前 PC ± 2GiB 的寻址范围 -
循 环展开:用户在下拉框中选择对应选项以控制传递给编译器的参数。传递
-funroll-loops参数给编译器即完全展开循环;传递-fno-unroll-loops参数给编译器即关闭循环展开,如果选择"不传任何参数给编译器"则编译器默认进行部分循环展开。 -
链接时优化:ZCC 编译器默认开启链接时优化,如果需要关闭链接时优化,需要给 ZCC 编译器传递
-fno-lto参数,但其他工具链,例如 GCC 和 Clang 默认不开启链接时优化。需要使用-flto参数来启用链接时优化。因此用户可以通过下拉框手动开启(-flto)或关闭(-fno-lto)链接时优化或选择"使用编译器默认参数",即是否启用链接时优化由当前编译器的默认选项决定。 -
移除未使用的函数段 (
-ffunction-sections) 和数据段 (-fdata-sections):允许移除不被引用的函数段或数据段。当同时选择这两个选项时,编译器会将每个函数/数据项放置在输出文件的独立代码段中,然后将--gc-sections选项传递给链接器,以移除从未被引用的函数/数据项。如果 ZCC(或其他工具链)充当链接器使用,则使用-wl, --gc-sections选项。 -
其他优化参数:此选项可以用于手动添加优化参数或关闭针对特定优化级别开启的默认优化选项。
-
-
编译器 > 调试
用户可以在此处指定生成调试信息的详细程度。
- 不显示:不生成或显示任何调试信息。
- 最低级别:记录基本的调试信息,如关键错误或检查点。
- 默认级别:记录更详细的信息,包括变量值或函数调用跟踪。
- 最高级别:最高级别的详细信息,捕获大量信息以进行彻底的调试分析。
-
链接器 > 常规
用户可以在此处配置链接选项,例如禁用标准启动文件,禁用默认库文件,禁用系统启动文件和库文件,指定链接脚本等。
-
链接脚本 : 指定一个链接器脚本链接进项目,用户需要在此处明确指定一个链接器脚本。ZCC 的链接器不支持链接脚本里面的
DEFINED宏,对于使用了DEFINED的 链接脚本,需要如下修改。关于 ZCC 对链接脚本的支持请参考 ZCC 使用手册。- __stack_size = DEFINED(__stack_size) ? __stack_size : 2K;
+ __stack_size = 2K;
-
-
目标文件处理工具
当启用目标文件处理工具(NM、Readelf、Objdump、Objcopy 和 Size 工具)时,在项目构建完成后,相关的输出结果将生成在项目目录树下的输出节点中。
运行
ZStudio 支持仿真器、虚拟开发板、物理开发板等运行方式。用户需要为需要为不同的项目及目标运行平台选择必要的配置。
| 运行目标 | 仿真器 | 虚拟开发板 | 物理开发板 | 远程开发板 |
|---|---|---|---|---|
| ZStudio 桌面版 | √ | √ | √ | |
| ZStudio Cloud | √ | √ | √ |
连接开发板运行
ZStudio 支持使用 OpenOCD 连接物理开发板运行或调试项目,参考连接开发板调试以及示例项目 hello_world_in_nuclei_sdk。
ZStudio Cloud 支持使用开发板共享平台(Terapines Board Farm)远程连接物理开发板运行或调试项目,参考使用开发板共享平台远程调试。
以仿真器运行
用户可参考以下步骤在仿真器上运行项目:
-
确认运行参数
从运行下拉框中点击
(运行配置)按钮打开弹窗可修改详细参数。
运行配置


-
程序参数:在此处指定传给运行的程序需要的参数。
-
连接目标:选择程序运行在仿真器上或在开发板上,这里选择仿真器(包括仿真器和虚拟开发板)。
-
仿真器参数:在此处指定传给仿真器需要的参数。
-
仿真器类型:选择内置仿真器或者使用本地仿真器,使用本地仿真器需要指定仿真器可执行文件路径。
-
选择开发板:运行在仿真器上的程序需要选择虚拟开发板。
-
内置:需要在仿真器虚拟开发板下拉列表中选择内置虚拟开发板。
-
自定义:需要在开发板配置文件中指定
.zvb文件,即在 ZExplorer 模式中使用 ZVB 搭建的虚拟模型。
-
-
仿真精度等级:
-
快速功能仿真(Emulation):运行速度更快,主要用于验证程序功能正确性,此模式只能得到少量性能数据。
-
时钟精确仿真(Simulation):运行速度较慢,但可以获取到程序运行的 Cycle 信息,也可以执行进一步性能分析(profiling)。
-
-
展示统计信息:选择是否在运行控制台中打印仿真器运行可执行程序的性能统计数据。

-
-
点击工具栏中
按钮或菜单栏中的"Run", ZStudio 根据当前活动项目调用 ZEMU 运行可执行文件,运行结果将自动输出到底部面板的运行控制台中。
调试
ZStudio 支持仿真器、虚拟开发板、物理开发板等调试目标。用户需要为需要为不同的项目及目标调试平台选择必要的配置。
| 调试目标 | 仿真器 | 虚拟开发板 | 物理开发板 | 远程开发板 |
|---|---|---|---|---|
| ZStudio 桌面版 | √ | √ | √ | |
| ZStudio Cloud | √ | √ | √ |
调试布局
ZStudio 支持编辑布局和调试布局之间的切换,调试布局便于查看调试过程中的寄存器、变量、调用堆栈等参考信息,帮助定位问题。用户点击工具栏左上角的按钮可以进行编辑布局和调试布局之间的切换。


连接开发板调试
连接开发板调试需要用户构建项目后将项目烧录到开发板设备上:
-
将开发板连接到当前 PC,确认计算机可以正确识别开发板设备。
提示请遵循各厂商开发板用户手册并检查是否需要安装驱动。
-
新建一个串行端口连接
在"视图"下拉菜单中选择"串口监控工具",点击 + 按钮配置串行端口连接参数,在串行端口下拉框中选择自动检测到的串行通讯端口,点击"确定"创建串口连接。
状态灯变为绿色代表当前串行端口连接成功。开发板与当前 PC 断开连接将会导致串行端口连接失败,状态灯变为红色。
查看下方表格了解串口监控工具提供的所有配置选项。
串口监控工具配置选项 设置项 使用说明 可用选项 串行端口 使用"串行端口"下拉列表选择端口 自动检测连接到计算机的串行端口兼容设备 波特率 使用"波特率"下拉列表或输入自定义参数决定串口监控工具尝试与连接的设备通信的频率 300、1200、2400、4800、9600、19200、38400、57600、74880、115200、230400、250000、自定义参数 数据位 使用"数据位"下拉列表选择用于串行端口连接的数据位数 5, 6, 7, 8 奇偶校验 使用"奇偶校验"下拉列表选择用于串行端口连接的奇偶校验 无、奇数、偶数、标记、空格 停止位 使用"停止位"下拉列表选择用于串行端口连接的停止位数 1, 1, 5, 2 -
指定调试配置
从调试下拉框中点击
(调试配置)打开配置窗口。指定开发板为运行和调试的连接目标,选择与开发板匹配的 OpenOCD 配置。
调试配置(开发板)


-
是否开启调试前自动构建程序。
-
是否在调试时自动在
Main()函数处停止。 -
程序参数:在此处指定传给运行的程序需要的参数。
-
连接目标:选择程序在仿真器上或在开发板上调试,这里选择开发板。
-
OpenOCD 可执行文件路径:用户需要指定 OpenOCD 可执行文件在当前 PC 文件系统中的位置。
-
OpenOCD 参数:在此处指定传给 OpenOCD 需要的参数。
-
OpenOCD 配置文件路径:用户需要指定 OpenOCD 配置文件在当前 PC文件系统中的位置。
-
调试器类型:选择内置调试器或者使用本地调试器,使用本地调试器需要指定调试器可执行文件路径。
-
端口:指定 OpenOCD 运行时监听的端口,默认为 3333。
提示请遵循各厂商开发板用户手册下载 OpenOCD 可执行文件和配置文件。
-
-
添加断点,开启调试会话。调试器运行到它遇到第一个断点停止。点击 "Step Over" 并在串口监控工具中检查项目输出。
关于连接开发板调试的示例项目,请参考hello_world_in_nuclei_sdk。
使用开发板共享平台远程调试
ZStudio Cloud 支持使用开发板共享平台中的开发板进行远程调试。
-
将项目换成 Debug 配置完成构建。
-
构建成功后,从
打开调试配置窗口,调试器连接目标选择为
Board。 -
预约开发板
-
在物理开发板下拉框中,选择
Apply Online Boards,跳转至开发板共享平台(Terapines Board Farm)。 -
在开发板共享平台(Terapines Board Farm)选择与程序适配的开发板,点击“申请”进入详情页。
-
在下方的时间表中,用鼠标拖选时间框进行预约,在弹出的对话框中进行确认。

-
-
选择已预约的开发板
完成预约后,返回 ZStudio,再次打开调试配置窗口。在调试器连接目标中选择
Board,此时物理开发板下拉框会显示已预约的开发板及当前需要等待的时间。

-
开始调试
添加断点后,启动调试会话。调试器会运行至第一个断点处自动停止,并在串口窗口打印输出。
以仿真器调试
用户可以遵循以下步骤在仿真器上调试项目:
- 将项目切换成 Debug 配置然后重新构建。
- 构建成功后,从
打开调试配置窗口,调试器链接目标默认为
Simulator,可添加参数。 - 添加断点,点击
按钮,开启调试会话,ZStudio 将会自动切换为调试视图。
请检查 Windows Defender 防火墙是否允许 zemu.exe 通过防火墙。
调试开始之前工具栏为不可选中状态(灰色),开启调试会话后用户可以进行相关快捷操作。从左至右依次为:
- 继续/暂停(Continue) F5
- 跨过(Step Over) F10:允许调试 器单步执行程序而不会进入子函数,并在执行完当前行后直接跳到下一行。即使当前行包含了函数调用,
Step Over也会跳过函数的执行,直接到达当前函数的下一行指令。 - 步入(Step Into) F11:允许调试器进入被调用函数的代码内部并逐步执行其中的语句。如果在函数中存在其他函数调用,可以继续使用
Step Into命令来进一步深入函数调用链。 - 跳出(Step Out) Shift+F11:允许调试器恢复运行直至函数返回。
- 重启(Restart) Control+Shift+F5
- 停止(Stop) Shift+F5
用户可以在调试视图中查看与调试相关的信息:
- 线程(THREADS):查看正在调试的代码中的线程。
- 调用堆栈(CALL STACK):查看线程调用的函数,检查代码执行流程。