You're reading an pre-release version of this documentation.
For the latest stable release version, please have a look at master.

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灯亮表示连接异常,如果出现这种现象,需要重新插拔仿真器,如果重新插拔仿真器后还是有问题,需要重启目标板和仿真器。

下载工程

  1. 下载 RT-Thread 官方 v4.0.5 标准版本至 CCS 工作目录

    1git clone -b v4.0.5 https://github.com/RT-Thread/rt-thread.git
    

    将得到 rt-thread 目录。

  2. 下载 x78ne 工程

    1cd rt-thread/bsp
    2git clone -b v20251222 https://gitlink.org.cn/nudt_dsp/x78ne.git
    

    下载完成后,在bsp目录中增加了 x78ne 文件。

  3. 下载 DDR 初始化程序

    1git clone https://gitlink.org.cn/nudt_dsp/x78ne_ddr_init.git
    

    下载完成后得到 x78ne_ddr_init.out DDR初始化可执行程序。

导入工程

  1. 打开CCS7.4

  2. 打开file -> import -> C/C++ -> CCS Projects -> Next

  3. 选择 Select search-directory -> Browse... -> 选择 rt-thread/bsp/x78ne/c6x 文件夹

  4. 选择 rtt_yolov4_tiny_demo 工程

  5. 勾选 Copy projects into workspace

  6. 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

连接至目标板

  1. CCS界面选择View->Target Configurations,显示 Target Configurations 小窗口。

  2. 选择 Projects 下 rtt_yolov4_tiny_demo 中的 x78ne.ccxml文件,即 rtt_yolov4_tiny_demo 工程下的 x78ne.ccxml 文件。

  3. 右键 x78ne.ccxml,选择Launch Selected Configuration,会跳转至调试界面,将出现8个DSP核和1个arm核连接的Debug界面

  4. 选择第一个 dsp 0核,Connect Target。连接成功会在核0下方出现如下字样:

    10x20B00000 (no symbols are defined)
    

至此,已成功连接至目标板,可下载程序至DSP核并运行,但在运行程序前,需要先初始化DDR。

初始化DDR

将 x78ne_ddr_init 文件夹中的 x78ne_ddr_init.out 可执行程序添加至 CCS 工作目录。

  1. 成功连接至目标板后,选择Run -> Load -> Load program... 或单击下载程序图标按钮。

  2. 在Program file一栏选择 x78ne_ddr_init.out 文件,点击OK。

  3. 运行程序。Run -> Resume 或单击运行程序图标按钮。

  4. 程序最后几行打印如下,即可表示初始化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

  1. 在调试界面点击View->Memory Browser,找到并点击load memory 按钮

  2. File 一栏中选择 applications/resource/network_binary.nb

  3. File Type 一栏中选择 Binary

  4. 点击:Next >

  5. Start Address 一栏中填写NBG存放地址:0xE0000000

  6. 点击:Finish

加载待推理数据

  1. 在调试界面点击View->Memory Browser,找到并点击load memory 按钮,会弹出 Load Memory 小窗口。

  2. File 一栏中选择 applications/resource/input_0.dat

  3. File Type 一栏中选择 Binary

  4. 点击:Next >

  5. Start Address 一栏中填写NBG存放地址:0xE1000000

  6. 点击:Finish

运行程序

  1. 下载程序:Run -> Load -> Load program... 或单击下载程序图标按钮。

  2. 选择该工程Debug目录下“rtt_yolov4_tiny_demo.out”。

  3. 运行程序: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