跳到主要内容

示例项目

ZStudio 中内置了部分示例项目。用户可以跟随示例项目熟悉 ZStudio 基本使用流程及各项功能。

Hello_with_dsp_and_nn_sdk_0.4.0

Hello_with_dsp_and_nn 是在芯来科技的 NucleiStudio 中编译后导出的项目。本节将用此示例项目演示如何在开发板上运行和调试项目。

导入示例项目

用户可以遵循以下步骤将示例项目导入 ZStudio:

  1. 在菜单栏中选择"文件" > "导入 Makefile 项目"。
  2. 导入 Makefile 项目弹窗中,指定 hello_with_dsp_and_nn_sdk_0.4.0 项目的根目录。
  3. 指定 入口 Makefile 文件,点击 browse-button 图标,在 hello_with_dsp_and_nn_sdk_0.4.0\Debug 目录下找到 Makefile 文件。
  4. 点击"导入"并选择在当前窗口或在新窗口打开,等到解决方案管理器中导入示例文件。

更新 Makefile 项目配置

在 ZStudio 中构建示例项目前,需要修正项目路径和不兼容的编译选项。

  1. 点击右下角弹窗中的"修复 Makefile 项目"更新项目配置。

    修复 Makefile 项目
  2. 修正项目路径:

    为了确保 ZStudio 能正确找到示例项目,需要将项目路径由 /home/tptuser/NucleiStudio_workspace/hello_with_dsp_and_nn_sdk_0.4.0 路径替换为 .

  3. 修正 ZCC 与 GCC 不兼容的编译选项:

    • 移除项目配置中所有的 -mtune=nuclei-300-series
    • 移除项目配置文件中所有的 stdc++ 库;需要移除所有完整的 JSON,即 ,{"value":"stdc++"}
    • 给编译器和链接器传 --target=riscv32-unknown-elf 参数,即指定目标平台
    • --specs=nano.specs --specs=nosys.specs 参数替换为 --config nano.cfg 参数

此项目中所有需要修复的内容如下图所示,点击"应用"即可完成修复。

更新 Makefile 项目配置
提示

在命令面板(Ctrl+Shift+P)中搜索并点击"修复 Makefile 项目"可重新调出弹窗。

构建示例项目

  1. 项目快捷控制中选择调试配置,点击开始构建。

  2. 构建控制台中检查项目构建输出;用户可通过构建控制台的下拉框过滤不同的输出信息。

  3. 构建完成后,在项目导航 output 节点或文件导航 hello_with_dsp_and_nn_sdk_0.4.0\output\debug 目录下检查是否生成了项目可执行文件或目标文件。

    Build the demo project

连接开发板运行和调试示例项目

  1. 将开发板通过 USB 连接计算机,确认电脑可以正确识别开发板设备。

    检查是否需要安装驱动,请访问 Nuclei Board Labs 遵循指导安装适用于 N300 的 Linux 和 Windows 驱动。

  2. 新建一个串行端口连接

    在"视图"下拉菜单中选择"串口监控工具",点击 + 按钮配置串行端口连接参数,在串行端口下拉框中选择自动检测到的串行通讯端口,点击"确定"创建串口连接。

    创建串行端口连接

    状态灯变为绿色代表当前串行端口连接成功。 开发板与当前 PC 断开连接将会导致串行端口连接失败,状态灯变为红色。

    串行端口连接成功
  3. 添加并启动 OpenOCD 配置

    在"视图"下拉菜单中选择"OpenOCD 资源管理器",点击 + 按钮创建 OpenOCD 配置,用户需要指定 OpenOCD 可执行文件和配置文件的位置。连接芯来科技 N300 开发板可遵循以下指引:

    配置OpenOCD
    • 前往芯来科技官网下载 OpenOCD 可执行文件,推荐 2022.12 以及更新版本。

    • OpenOCD 配置文件存放在示例项目文件夹下 ${projectPath}/nuclei_sdk/SoC/demosoc/Board/nuclei_fpga_eval/openocd_demosoc.cfg

    右键已添加的 OpenOCD 选择开启或关闭当前 OpenOCD 的进程,状态灯变为绿色代表当前 OpenOCD 进程正在进行。

    成功启动OpenOCD
    提示

    开发板电源关闭或与 PC 断开连接均可能导致 OpenOCD 与开发板的连接断开,此时状态灯为绿色仅代表当前 OpenOCD 进程正在进行,需检查后重启 OpenOCD。

  4. 指定运行和调试配置

    项目快捷控制点击 gear-button(运行/调试配置)打开配置窗口。指定开发板为运行和调试的连接目标,选择与开发板匹配的 OpenOCD 配置。

    指定运行和调试配置
  5. 回到解决方案资源管理器,点击 debug-start-button 开始运行项目,在串口监控工具中检查项目输出。

    检查项目输出
  6. 添加断点,开启调试会话。调试器运行到它遇到第一个断点停止。点击 "Step Over" 并在串口监控工具中检查项目输出。

    连接开发板开启调试会话

AccInst

本节将用 AccInst 示例项目演示如何利用程序性能分析工具定位函数层级性能瓶颈并进行针对性的代码优化。

打开 AccInst 解决方案

用户可以遵循以下步骤在 ZSolution 中打开示例项目:

  1. 在菜单栏选择"文件" > "从示例解决方案开始",在下拉框中选择 AccInst 并打开。

  2. 查看 AccInst 解决方案中的 Normal 项目和 Accelerated 项目。和 Normal 项目相比, Accelerated 项目在源码中添加了特殊加速指令。

    添加加速指令

构建

用户可以遵循以下步骤构建 Normal 项目和 Accelerated 项目:

  1. Normal 项目设置为当前活动项目,选择 Debug 配置和 RISC-V 架构,点击"构建",并在构建控制台中确认构建输出。

    构建 <em>Normal</em> 项目
  2. Accelerated 项目设置为当前活动项目,其他配置保持不变,点击"构建",并在构建控制台中确认构建输出。

    构建 <em>Accelerated</em> 项目

执行性能分析

用户可以遵循以下步骤为 Normal 项目和 Accelerated 项目执行性能分析:

  1. 成功构建后,将 Normal 项目设置为当前活动项目,点击菜单栏 "运行" >"性能分析"生成该项目的性能分析数据,性能分析完成之前不要重新执行该行为,以免生成错误数据。完成后右下角会生成提示信息。

    为 *Normal* 项目执行性能分析
  2. Accelerated 项目设置为当前活动项目,点击菜单栏 "运行" > "性能分析"生成该项目的性能分析数据,性能分析完成之前不要重新执行该行为,以免生成错误数据。完成后右下角会生成提示信息。

    为 *Accelerated* 项目执行性能分析

对比性能分析结果

根据函数执行统计(Function Summary)中的 self cycleself instructiontpt_mat_cmplx_mult_q15 为瓶颈函数。函数 tpt_mat_cmplx_mult_q15 包含了一个三层嵌套的循环。最内层的循环执行矩阵乘法运算。由于最内层循环是 CPU 花费最多时间的地方,因此优化 tpt_mat_cmplx_mult_q15 函数的性能会对整个代码的性能产生改进。

用户可以遵循以下步骤利用对比工具直观比较性能分析结果:

  1. 在主菜单中,点击"视图" > "性能分析对比" 调出对比工具。

  2. 在"性能分析对比"视图的左侧栏中,右键 Normal 项目的性能分析结果,并点击"选为对比基准"。

    将 *Normal* 项目设置为对比基准
  3. 点击comparison-configuration-button 按钮打开设置窗口,调整完设置后,点击 "确定" 关闭窗口。

    • 选择"程序性能指标对比"的数据可视化形式:至少选择图或表格中的一种形式。

    • 选择对比项:默认对比项为"指令总数","周期总数"以及"单位周期执行的指令数",用户可自行选择对比项。

  4. 用户可以按住 ShiftCtrl 键选择两个结果,右击其中一个,然后选择"对比"。

    选择 *Normal* 和 *Accelerated* 性能分析结果进行对比
  5. 性能分析对比视图将在编辑器中打开。

    性能分析对比

Accelerated 项目中 tpt_mat_cmplx_mult_q15 函数 selfcycleself instruction 指标的降低以及项目总周期数和总指令数的降低证明了优化瓶颈函数会提升整个程序的性能。

HPMicro Demo

本节将用先楫(HPMicro)SDK 中的示例项目演示如何在 ZSolution 中使用 HPM Tool 进行一站式嵌入式开发。

HPMicro SDK 导入

用户可以遵循以下步骤在 ZSolution 中导入先楫 SDK 示例项目:

  1. 首先前往下载 HPMicro SDK ,先楫自 hpm_sdk v1.6.0 起正式添加对兆松 ZCC 工具链的支持,请下载 v1.6.0 或更新版本。

  2. 在菜单栏选择"文件" > "导入 CMake 项目",在导入弹窗中,配置 CMake。

    • 项目根目录:在文件系统中选择 HPMicro SDK 保存在本地电脑的根目录。
    • CMake 工作目录:此处需要指向执行"cmake"命令,存放生成 CMake 文件的文件夹。推荐在 SDK 的 sample/hello_world 目录下新建一个 build 文件夹,此处填入新建的 build 文件夹的绝对路径。
    • CMake 运行参数:此处指定生成项目所需的完整 CMake 参数。 -DBOARD=hpm5300evk .. 表示要构建运行在 hpm5300evk 开发板上的目标程序。
    • 环境变量: 点击 + 添加在导入过程中传给 CMake 的环境变量。
      • 工具链目录的绝对路径 GNURISCV_TOOLCHAIN_PATH=${Absolute_path_of_your_zcc_toolchain_directory}
      • 使用 ZCC 工具链进行编译 HPM_SDK_TOOLCHAIN_VARIANT=zcc
      • SDK 根目录的绝对路径 HPM_SDK_BASE={Absolute_path_of_your_SDK_top-level_folder}
    导入 HPMicro SDK
  3. 点击"导入"并在运行控制台中检查导入进度。导入成功左侧项目导航栏会出现 hpm_sdk_gcc_libhpm_sdk_libdemo 这三个项目。

    检查项目导入

使用 HPM Tools 配置引脚

ZSolution 整合了先楫提供的 HPMicro Tools(Pinmux 和 Clock tool),支持直接在 ZStudio 中配置 MCU 芯片引脚和时钟,同时进行应用开发与调试。本项目演示通过设置一个 IO 口输出高电平或者低电平来点亮或者熄灭一个 LED 灯。

  1. 点从菜单栏中的 "工具" > "先楫工具集" 中进入 HPMicro Tools 页面,选择目标开发平台 SoC 为 "HPM5361", 选择 Package 为 "LQFP100",点击"创建项目"。

    在 ZSolution 中使用 HPMicro Tools
  2. 参考 HPM5300EVK 开发板原理图 选择一个与芯片 IO 口相连的 LED 灯, 从原理图中可以看到,LED2 的阳极连接 3.3V,阴极连接 PA23 IO口,所以当设置 PA23 输出低电平就可以点亮 LED 灯,当设置 PA23 输出高电平时,LED 灯熄灭。

    HPM5300EVK 开发板原理图
  3. 在 ZSolution 中配置初始化 PA23 IO 口,即 HPM5361 引脚的 GPIO 功能。点击 PA23 引脚,在弹窗中选择 GPIO.A[23],设置 GPIO 的相关属性,设置方向为"输出",设置初始输出电平为"高电平",选择 GPIO 控制器为 "GPIO0",然后点击"确定"。

    初始化 PA23 IO 口
  4. 点击右上角的"代码预览" 可以查看 HPM Pinmux Tool 生成的引脚配置初始化代码(.c 文件和 .h 文件)。由于 HPM SDK 中已经存在 HPM Pinmux Tool 生成的 .h 文件,只需要把 .c 文件应用到项目中即可。

    预览代码
  5. HPM Pinmux Tool 生成的源码文件的文件名和函数名和 SDK 中的源码文件和函数名冲突,所以为了避免冲突。本 demo 只拷贝 HPM Pinmux Tool 提供的引脚配置初始化代码即可。在导入的 helloworld demo 项目中,将 helloworld.c 删除。创建 main.c 文件并将生成的功能配置代码在 main.c 中使用。

    main.c
    /*
    * Copyright (c) 2021 HPMicro
    *
    * SPDX-License-Identifier: BSD-3-Clause
    *
    */

    #include <stdio.h>
    #include "board.h"
    #include "hpm_debug_console.h"
    #include "hpm_gpio_drv.h"
    #include "hpm_gpiom_drv.h"

    static void init_pins_led(void)
    {
    // Pin initialization code generated by HPM Pinmux Tool
    HPM_IOC->PAD[IOC_PAD_PA23].FUNC_CTL = IOC_PA23_FUNC_CTL_GPIO_A_23;

    gpiom_set_pin_controller(HPM_GPIOM, GPIOM_ASSIGN_GPIOA, 23, gpiom_soc_gpio0);
    gpio_set_pin_output(HPM_GPIO0, GPIO_OE_GPIOA, 23);
    gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOA, 23, 1);
    }

    int main(void)
    {
    board_init(); // Initialize the development board

    init_pins_led(); // Initialize the GPIO for the LED

    while(1)
    {
    gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOA, 23, 0); // Set pin low to turn on LED
    board_delay_ms(500);
    gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOA, 23, 1); // Set pin high to turn off LED
    board_delay_ms(500);
    }
    return 0;
    }

如上面的代码所示,main 函数调用 SDK 里的 board_init 函数完成对开发板的外设时钟和部分 IO 的初始化。随后调用 init_pins_led 函数,该函数内的 GPIO 的初始化代码就是 HPM Pinmux Tool 生成的。在 while 循环中使用 gpio_write_pin 函数设置 GPIO PA23 IO 口的电平状态,使用 SDK 内实现的 board_delay_ms 延时函数,实现 LED 灯的交替闪烁。

程序编译烧录运行

ZSolution 支持通过 OpenOCD 将程序烧录运行至开发板。

  1. 首先构建项目:将当前活动项目(Active Project)设置为"demo",点击构建,并在构建控制台中检查结果,构建成功后将生成可执行文件。

    构建项目
  2. 配置 OpenOCD:获取先楫半导体 OpenOCD, 找到 Windows 或 Linux 系统对应的 OpenOCD 和开发板配置文件。在ZSolution "视图"下拉菜单中选择"OpenOCD 资源管理器",点击 + 按钮创建 OpenOCD 配置,用户需要指定 OpenOCD 可执行文件和配置文件在当前 PC 文件系统中的位置。

    添加 HPM5361 的 OpenOCD 配置

这里我们使用的是 hpm5361evk 开发板,有两个配置文件,分别是 hpm6750-single-core.cfgft2232.cfg 将这个两个文件的绝对路径添加到配置文件中即可。

  1. 启动 OpenOCD:右键已添加的 OpenOCD 选择开启或关闭当前 OpenOCD 的进程,状态灯变为绿色代表当前 OpenOCD 进程正在进行。

    OpenOCD 启动成功
  2. 运行程序:在运行设置中选择连接目标为"开发板",选择上一步创建的 OpenOCD 配置,保存后运行程序。可以看到开发板的 LED 交替闪烁。

    LED 交替闪烁