DSP 端 RT-Thread 模型部署
概述
本项目旨在为开发者提供基于DSP平台的网络模型部署参考方案,通过在 x78NE 多核处理器上实现 RT-Thread 操作系统的深度适配,构建了从底层硬件驱动到上层AI推理的全栈式开发框架。
版本说明
RT-Thread:v4.0.5
CCS:v7.4
CCS编译器:v8.2.2
Lite驱动版本:v1.15.0
环境搭建
环境要求
目标板: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灯亮表示连接异常,如果出现这种现象,需要重新插拔仿真器,如果重新插拔仿真器后还是有问题,需要重启目标板和仿真器。
下载工程
下载 RT-Thread 官方
v4.0.5标准版本至 CCS 工作目录1git clone -b v4.0.5 https://github.com/RT-Thread/rt-thread.git
将得到
rt-thread目录。下载 x78ne 工程
1cd rt-thread/bsp 2git clone -b v20251222 https://gitlink.org.cn/nudt_dsp/x78ne.git
下载完成后,在bsp目录中增加了
x78ne文件。下载 DDR 初始化程序
1git clone https://gitlink.org.cn/nudt_dsp/x78ne_ddr_init.git
下载完成后得到
x78ne_ddr_init.outDDR初始化可执行程序。
导入工程
打开CCS7.4
打开file -> import -> C/C++ -> CCS Projects -> Next
选择 Select search-directory -> Browse... -> 选择
rt-thread/bsp/x78ne/c6x文件夹选择
rtt_yolov4_tiny_demo工程勾选 Copy projects into workspace
Finish
工程目录结构
导入完成后, rtt_yolov4_tiny_demo 工程目录结构如下所示:
1rtt_yolov4_tiny_demo
2 ├── applications /* 应用示例程序 */
3 │ ├── postprocess
4 │ ├── resource
5 │ └── rtt_yolov4_tiny_demo.c
6 ├── board /* Pnna 板卡初始化函数 */
7 │ ├── board.c
8 │ └── board.h
9 ├── drivers /* 78ne板卡板级支持包 */
10 │ ├── drv_timer.c
11 │ ├── drv_timer.h
12 │ ├── x78ne
13 │ │ ├── include
14 │ │ └── src
15 │ └── pnna_driver /* pnna 驱动接口 */
16 │ ├── include
17 │ ├── lib
18 │ └── README.md
19 ├── rtconfig.h /* 配置与硬件平台相关的选项 */
20 ├── include /* 存放 RT-Thread 内核的头文件。(从rt-thread工程中链接得到) */
21 ├── libcpu /* 包含 DSP 移植代码,用于将 RT-Thread 移植到 DSP 架构上 */
22 ├── src /* 存放 RT-Thread 内核的源文件,是 RT-Thread 内核的核心实现部分。
23 │ (从rt-thread工程中链接得到) */
24 └── 78E.cmd /* 链接器命令文件 */
编译工程
鼠标右键单击 rtt_yolov4_tiny_demo 工程文件 -> Build Project 即可。
或者单击 rtt_yolov4_tiny_demo 工程选中后,单击 CCS 界面上编译图标按钮即可。
编译完成后,在 Debug 目录下会生成可执行程序:rtt_yolov4_tiny_demo.out
连接至目标板
CCS界面选择View->Target Configurations,显示 Target Configurations 小窗口。
选择 Projects 下 rtt_yolov4_tiny_demo 中的 x78ne.ccxml文件,即 rtt_yolov4_tiny_demo 工程下的 x78ne.ccxml 文件。
右键 x78ne.ccxml,选择Launch Selected Configuration,会跳转至调试界面,将出现8个DSP核和1个arm核连接的Debug界面
选择第一个C66xx_0核,Connect Target。连接成功会在核0下方出现如下字样:
10x20B00000 (no symbols are defined)
至此,已成功连接至目标板,可下载程序至DSP核并运行,但在运行程序前,需要先初始化DDR。
初始化DDR
将 x78ne_ddr_init 文件夹中的 x78ne_ddr_init.out 可执行程序添加至 CCS 工作目录。
成功连接至目标板后,选择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 一栏中选择 applications/resource/network_binary.nb
File Type 一栏中选择 Binary
点击:Next >
Start Address 一栏中填写NBG存放地址:0xE0000000
点击:Finish
加载待推理数据
在调试界面点击View->Memory Browser,找到并点击load memory 按钮,会弹出 Load Memory 小窗口。
File 一栏中选择 applications/resource/input_0.dat
File Type 一栏中选择 Binary
点击:Next >
Start Address 一栏中填写NBG存放地址:0xE1000000
点击:Finish
运行程序
下载程序:Run -> Load -> Load program... 或单击下载程序图标按钮。
选择该工程Debug目录下“rtt_yolov4_tiny_demo.out”。
运行程序:Run -> Resume
输出结果
程序运行结果如下所示:
1heap: 0xa0000000 - 0xa4000000
2
3 \ | /
4- RT - Thread Operating System
5 / | \ 4.0.5 build Apr 11 2025 16:15:28
6 2006 - 2021 Copyright by rt-thread team
7npu[a0000010] gck pnna_drv_init, video memory heap base: 0xc0000000, size: 0x04000000
8npu[a0000010] HASHMAP 0x804a953c(process-ID) INIT SUCCESS
9npu[a0000010] DATABASE 0x804aa228(task-desc) INIT SUCCESS
10npu[a0000010] DATABASE 0x804aa1ec(memory-mgt) INIT SUCCESS
11init pnna lite, driver version=0x00010f00...
12cid=0xb1, device_count=1
13 device[0] core_count=1
14input 0 dim 416 416 3 1, data_format=2, quant_format=2, name=input[0], scale=0.003922, zero_point=0
15ouput 0 dim 13 13 255 1, data_format=2, name=uid_64_out_0, scale=0.112487, zero_point=190
16ouput 1 dim 26 26 255 1, data_format=2, name=uid_75_out_0, scale=0.096643, zero_point=207
17memory pool size=2796800byte
18network core count=1
19start to run network=network_binary.nb, times=0, input_address=0xe1000000
20run network done...
21profile inference time=0.001000ms, cycle=9485424
22boxes number: 10
232 0.460957 0.775011 0.223272 0.305353 0.176144
2416 0.902439 0.289818 0.642779 0.259141 0.637094
251 0.732628 0.423077 0.504524 0.660328 0.612339
267 0.745452 0.759695 0.218838 0.341707 0.176144
27Destroy resource network items.
网络推理结果:
12 0.460957 0.775011 0.223272 0.305353 0.176144
216 0.902439 0.289818 0.642779 0.259141 0.637094
31 0.732628 0.423077 0.504524 0.660328 0.612339
47 0.745452 0.759695 0.218838 0.341707 0.176144
每列分别表示:目标类别、置信度、中心点坐标x、中心点坐标y、框的宽、框的高
作者 @xyy xunyingya@hngwg.com