DSP 端裸机模型部署
概述
DSP 做主控时,通过 pnna_driver 驱动,在 Pnna 上部署应用程序。
环境搭建
环境要求
目标板:X78NE
目标板配套的电源
DSP 高速仿真器及其 USB 连接线
CCS版本:CCS7.4,默认编译器版本 v8.2.2。(请自行安装)
仿真器驱动安装
下载驱动
1git clone https://gitlink.org.cn/nudt_dsp/emulation_drivers.git
找到CCS安装目录,如:C:\ti\ccsv7\ccs_base\emulation.
备份driver目录。
将 emulation_drivers 下 dvr 文件中的所有文件添加至 driver 目录。
解压 USB仿真器设备驱动.rar,完成后再解压 CDM21228_Setup.zip ,双击运行 CDM21228_Setup.exe ,安装仿真器驱动。
连接仿真器
连接好目标板电源。
连接仿真器,一端接电脑USB,另一端接到板子的 JTAG_DSP 口。
其中,仿真器的RUN灯亮表示正常工作,ERROR灯亮表示连接异常,如果出现这种现象,需要重新插拔仿真器,如果重新插拔仿真器后还是有问题,需要重启目标板和仿真器。
导入工程
下载示例工程
1git clone -b v20251222 https://gitlink.org.cn/nudt_dsp/pnna.git
打开CCS7.4
打开file -> import -> C/C++ -> CCS Projects -> Next
选择 Select search-directory -> Browse... -> 选择 yolov5s_metal_c6x 文件夹
勾选 Copy projects into workspace
Finish
整个目录文件夹如下所示,其中 driver_metal_c6x、include 和 src 目录为 CCS 链接资源(Linked Resources),在 CCS 工程视图中以带箭头的文件/目录图标显示。
1yolov5s_demo
2 ├── x78ne/ /* 板级支持包 */
3 │ ├── include/
4 │ └── src/
5 ├── log.h /* 日志头文件 */
6 ├── driver_metal_c6x/ /* 链接文件。Lite 驱动框架 */
7 │ ├── driver/
8 │ ├── hal/
9 │ └── sdk/
10 ├── include/ /* 链接文件。PNNA API 头文件 */
11 ├── src/ /* 链接文件。PNNA API 实现文件 */
12 ├── postprocess/ /* yolov5s 后处理文件 */
13 ├── resource/ /* yolov5s nbg文件和输入数据 */
14 ├── x78ne.cmd /* 内存布局和程序段在内存中的放置情况 */
15 ├── x78ne.ccxml /* 描述和配置调试器连接信息 */
16 ├── vector.asm /* 中断向量汇编文件 */
17 └── yolov5s_demo.c /* yolov5s 示例程序 */
链接资源表示这些文件或目录并非存放在当前 CCS 工程路径下,而是通过 CCS 的 Linked Resources 机制引用自其他位置的实体文件。 该机制通常用于在多个工程之间共享通用代码(如驱动、公共头文件和核心实现),以避免文件重复拷贝和代码分叉。
需要注意的是:
在 CCS 中可像普通文件一样直接查看和编辑这些链接文件
实际修改的是其引用的实体文件,而非当前工程目录下的副本
在工程所在的文件系统路径中,链接目录在物理层面为空或不存在
链接路径的配置位置如下:
右键工程 → Properties → Resource → Linked Resources
Path Variables 中的
ORIGINAL_PROJECT_ROOT参数用于指定链接文件所在的根路径Linked Resources 列表展示当前工程中配置的链接文件或链接目录
该设计有利于统一维护底层代码,并支持多个 CCS 工程复用同一套实现。
编译工程
鼠标右键单击 yolov5s_demo 工程文件 -> Build Project 即可。
或者单击 yolov5s_demo 工程选中后,单击 CCS 界面上编译图标按钮即可。
编译完成后,在 Debug 目录下会生成可执行程序:yolov5s_demo.out
连接至目标板
CCS界面选择View->Target Configurations,显示 Target Configurations 小窗口,选择 Projects 下yolov5s_demo中的 x78ne.ccxml文件,即 yolov5s_demo 工程下的 x78ne.ccxml 文件。
右键 Target Configurations 小窗口下的 x78ne.ccxml,选择Launch Selected Configuration,会跳转至调试界面,将出现8个DSP核和1个arm核连接的Debug界面
选择第一个C66xx_0核,Connect Target。连接成功会在核0下方出现如下字样:
10x20B00000 (no symbols are defined)
至此,已成功连接至目标板,可下载程序至DSP核并运行,但在运行程序前,需要先初始化DDR。
初始化DDR
下载 DDR 初始化程序
1git clone https://gitlink.org.cn/nudt_dsp/x78ne_ddr_init.git
下载完成后得到 x78ne_ddr_init.out DDR初始化可执行程序。
成功连接至目标板后,选择Run -> Load -> Load program... 或单击下载程序图标按钮。
在Program file一栏选择 x78ne_ddr_init.out 文件,点击OK。
运行程序。Run -> Resume 或单击运行程序图标按钮。
程序最后几行打印如下,即可表示初始化DDR成功。如果目标板重新断电或者CCS重新启动,都需要重新运行初始化DDR程序。
1slice 0, PHY_PAD_VREF_CT = 0x4ab
2slice 1, PHY_PAD_VREF_CT = 0x4a9
3slice 2, PHY_PAD_VREF_CT = 0x4ad
4slice 3, PHY_PAD_VREF_CT = 0x4a9
5slice 4, PHY_PAD_VREF_CT = 0x4ab
6slice 5, PHY_PAD_VREF_CT = 0x4af
7slice 6, PHY_PAD_VREF_CT = 0x4a6
8slice 7, PHY_PAD_VREF_CT = 0x4a8
9slice 8, PHY_PAD_VREF_CT = 0x4a8
10Start CTL address bist
11CTL Address bist passed
12Start CTL data bist
13CTL Data bist passed
14Start PI addr bist
15DDR4 addr bist pass!
16Start PI data bist
17DDR data bist pass!
18DDR zero memory start...
19zero memory done
程序运行
加载NBG
在调试界面点击View->Memory Browser,找到并点击load memory 按钮
File 一栏中选择 project/resource/network_binary.nb
File Type 一栏中选择 Binary
点击:Next >
Start Address 一栏中填写NBG存放地址:0xE0000000
点击:Finish
加载待推理数据
在调试界面点击View->Memory Browser,找到并点击load memory 按钮,会弹出 Load Memory 小窗口。
File 一栏中选择 project/resource/input_0.dat
File Type 一栏中选择 Binary
点击:Next >
Start Address 一栏中填写NBG存放地址:0xE1000000
点击:Finish
运行程序
下载程序:Run -> Load -> Load program... 或单击下载程序图标按钮。
选择该工程Debug目录下“yolov5s_demo.out”。
运行程序:Run -> Resume
输出结果
程序运行结果如下所示:
1npu core_0, request irqline=179, name=pnnacore_0
2npu pnnacore, heap_cnt=0, name=heap-reserved video memory cpu_phy=0xc0000000, pnna_phy=0xc0000000, size=0x8000000
3npu PNNALite driver version 1.15.0.0
4npu HASHMAP 0x85058afc(process-ID) INIT SUCCESS
5npu DATABASE 0x85059804(task-desc) INIT SUCCESS
6npu DATABASE 0x850597a8(memory-mgt) INIT SUCCESS
7HASHMAP 8093d134(record-list) INIT SUCCESS
8create_app_ctx done
9postprocess done
10Total detections: 5
110 0.88 42.25 230.98 193.50 540.77
120 0.88 176.05 242.06 271.83 508.38
130 0.88 532.30 229.30 639.58 519.95
140 0.59 -0.03 325.05 55.41 517.27
155 0.47 13.00 131.06 619.75 461.44
16destroy app_ctx_t done.
17pnna closed
程序运行结束后,控制台将输出目标检测相关信息,包括:
检测框数量: 表示在当前输入图像中检测到的目标总数。
单个检测框信息: 每一行对应一个检测结果,字段通常包括:
类别 ID
置信度
目标框位置信息(相对于输入图像的坐标)
具体字段含义与顺序以当前工程后处理实现为准。
流程解释
NBG和input
宏定义配置 在 yolov5s_demo.c 文件顶部,通过宏定义指定了 NBG 模型文件和输入图片数据的内存地址及大小:
1/* --- Configuration Constants --- */ 2#define NBG_BUFFER_ADDR 0xE0000000 // NBG 模型文件存放内存起始地址 3#define INPUT_BUFFER_ADDR 0xE2000000 // 输入图片二进制数据存放内存起始地址 4#define NBG_BUFFER_SIZE 22097124U // NBG 模型文件大小 (单位: 字节) 5#define INPUT_BUFFER_SIZE 2457600U // 输入图片二进制大小 (单位: 字节)
其中:
NBG_BUFFER_ADDR:NBG 模型在 DDR 中的加载位置。
INPUT_BUFFER_ADDR:输入图片数据在 DDR 中的加载位置。
NBG_BUFFER_SIZE:模型文件实际大小(可通过 Windows 文件属性查看,精确到字节)。
INPUT_BUFFER_SIZE:输入数据的实际大小。
在 main() 函数中的初始化 程序在 main() 函数中利用上述宏定义初始化 buffer_t 结构体,随后将其传入 create_app_ctx 函数中创建应用上下文:
1// 定义 NBG 缓冲区信息 2buffer_t nbg_buffer = { 3 .data = (void *)NBG_BUFFER_ADDR, 4 .size = NBG_BUFFER_SIZE 5}; 6 7// 定义输入数据缓冲区信息 8buffer_t input_data = { 9 .data = (void *)INPUT_BUFFER_ADDR, 10 .size = INPUT_BUFFER_SIZE 11}; 12 13// 创建上下文 14app_ctx_t *yolov5s_model = create_app_ctx(&nbg_buffer, NULL, postprocess);
修改参数说明:
若更换了网络模型(NBG),请务必更新 NBG_BUFFER_SIZE 为新文件的大小。
若更换了输入图片的尺寸或格式导致数据量变化,请更新 INPUT_BUFFER_SIZE。
修改宏定义参数后,必须重新编译工程方可生效。
运行前准备(重要) 程序本身不包含文件读取功能,仅对内存指定位置的数据进行推理。 因此在运行程序前,必须通过仿真器(Emulator)将 NBG 文件和输入二进制文件(.dat/.bin) 预先加载至 DDR 对应的地址(即 0xE0000000 和 0xE2000000)。
应用程序推理流程
应用程序读取待处理数据,根据数据类型进行预处理操作,选择是否需要归一化和量化。
预处理操作完成后将待推理数据和NBG文件交给Pnna核进行推理。
推理完成后将数据进行反量化操作,并根据模型类型进行相应的分类或检测等处理。
最后输出结果。
整体流程
通过 CCS 编译推理工程
将 NBG 文件和待推理数据传输至板卡上的 DDR 固定位置
板卡上主控制器(CPU / DSP)根据可执行程序内容,将 DDR 固定位置的 NBG 文件和待处理数据通过驱动加载至 Pnna 核上运行,处理完成后通知主控制器到固定地址取回结果
在运行网络模型示例程序前,需要先连接至目标板并初始化DDR。
作者 @xyy xunyingya@hngwg.com