Go to file
xunyingya c6fea3459f 更新nn_api.c后同步更新lib 2025-04-22 17:16:51 +08:00
.settings 重新添加3个子模块后更新ccsproject设置 2025-04-22 10:07:37 +08:00
bsp 更新nn_api.c后同步更新lib 2025-04-22 17:16:51 +08:00
ddr_init 调整ccsproject设置以及主函数内容 2025-04-11 16:19:25 +08:00
include first add 2025-04-11 15:11:33 +08:00
libcpu first add 2025-04-11 15:11:33 +08:00
src first add 2025-04-11 15:11:33 +08:00
.ccsproject 重新添加3个子模块后更新ccsproject设置 2025-04-22 10:07:37 +08:00
.cproject 重新添加3个子模块后更新ccsproject设置 2025-04-22 10:07:37 +08:00
.gitmodules 重新添加3个子模块 2025-04-22 09:59:28 +08:00
.project first add 2025-04-11 15:11:33 +08:00
README.md 更加文件夹位置和名称重写reamde中相关内容 2025-04-21 17:31:13 +08:00
m6678ne.ccxml 调整ccsproject设置以及主函数内容 2025-04-11 16:19:25 +08:00
m6678ne.cmd first add 2025-04-11 15:11:33 +08:00

README.md

DSP 端 RT-Thread 模型部署

概述

本项目旨在为开发者提供基于DSP平台的网络模型部署参考方案通过在 FT-6678NE 多核处理器上实现 RT-Thread 操作系统的深度适配构建了从底层硬件驱动到上层AI推理的全栈式开发框架。

版本说明

  • RT-Threadv4.0.5
  • CCSv7.4
  • CCS编译器v8.2.2
  • Lite驱动版本v1.15.0

环境搭建

环境要求

  • 目标板FT78E_DSKC_202311V0
  • 目标板配套的电源
  • 仿真器FT-EMU560及USB连接线
  • CCS版本CCS7.4,默认编译器版本 v8.2.2。(请自行安装)

仿真器驱动安装

  • 下载驱动
git 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. 下载示例工程

    git clone --recursive https://gitlink.org.cn/nudt_dsp/rt-thread.git
    
  2. 打开CCS7.4

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

  4. 选择 Select search-directory -> Browse... -> 选择 rt-thread 文件夹

  5. 勾选 Copy projects into workspace

  6. Finish

工程目录结构

工程目录结构如下所示:

RT-Thread-405
    ├── bsp/ftm6678ne
    │    └── c6x
    │        ├── applications          /* 应用示例程序 */
    │        │   ├── examples
    │        │   └── yolov4_tiny_demo.c
    │        ├── board                 /* Pnna 板卡初始化函数 */
    │        │   ├── board.c
    │        │   └── board.h
    │        ├── drivers               /* 78ne板卡板级支持包 */
    │        │   ├── drv_timer.c
    │        │   ├── drv_timer.h
    │        │   ├── m6678ne
    │        │   │   ├── include
    │        │   │   └── src
    │        │   └── pnna              /* pnna 驱动接口 */
    │        │       ├── include
    │        │       ├── lib
    │        │       └── README.md
    │        └── rtconfig.h      /* 配置与硬件平台相关的选项 */
    ├── ddr_init                 /* DDR 初始化可执行程序 */
    ├── include                  /* 存放 RT-Thread 内核的头文件 */
    ├── libcpu                   /* 包含 DSP 移植代码,用于将 RT-Thread 移植到 DSP 架构上 */
    ├── src                      /* 存放 RT-Thread 内核的源文件,是 RT-Thread 内核的核心实现部分 */
    └── 78E.cmd                  /* 链接器命令文件 */

编译工程

鼠标右键单击 RT-Thread-405 工程文件 -> Build Project 即可。

或者单击 RT-Thread-405 工程选中后,单击 CCS 界面上编译图标按钮即可。

编译完成后,在 Debug 目录下会生成可执行程序RT-Thread-405.out

连接至目标板

  1. CCS界面选择View->Target Configurations显示 Target Configurations 小窗口,选择 Projects 下 RT-Thread-405 中的 m6678ne.ccxml文件即 RT-Thread-405 工程下的 m6678ne.ccxml 文件。

  2. 右键 Target Configurations 小窗口下的 m6678ne.ccxml选择Launch Selected Configuration会跳转至调试界面将出现8个DSP核和1个arm核连接的Debug界面

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

    0x20B00000 (no symbols are defined)
    

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

初始化DDR

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

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

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

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

  4. 程序最后几行打印如下即可表示初始化DDR成功。如果目标板重新断电或者CCS重新启动都需要重新运行初始化DDR程序。

slice 0, PHY_PAD_VREF_CT = 0x4ab
slice 1, PHY_PAD_VREF_CT = 0x4a9
slice 2, PHY_PAD_VREF_CT = 0x4ad
slice 3, PHY_PAD_VREF_CT = 0x4a9
slice 4, PHY_PAD_VREF_CT = 0x4ab
slice 5, PHY_PAD_VREF_CT = 0x4af
slice 6, PHY_PAD_VREF_CT = 0x4a6
slice 7, PHY_PAD_VREF_CT = 0x4a8
slice 8, PHY_PAD_VREF_CT = 0x4a8
Start CTL address bist 
CTL Address bist passed
Start CTL data bist 
CTL Data bist passed
Start PI addr bist 
DDR4 addr bist pass!
Start PI data bist 
DDR data bist pass!
DDR zero memory start...
zero memory done

程序运行

加载NBG

  1. 在调试界面点击View->Memory Browser找到并点击load memory 按钮
  2. File 一栏中选择 examples/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 一栏中选择 examples/resource/input_0.dat
  3. File Type 一栏中选择 Binary
  4. 点击Next >
  5. Start Address 一栏中填写NBG存放地址0xE1000000
  6. 点击Finish

运行程序

  1. 下载程序Run -> Load -> Load program... 或单击下载程序图标按钮。
  2. 选择该工程Debug目录下“RT-Thread-405.out”。
  3. 运行程序Run -> Resume

输出结果

程序运行结果如下所示:

heap: 0xa0000000 - 0xa4000000

 \ | /
- RT -     Thread Operating System
 / | \     4.0.5 build Apr 11 2025 16:15:28
 2006 - 2021 Copyright by rt-thread team
npu[a0000010] gck pnna_drv_init, video memory heap base: 0xc0000000, size: 0x04000000
npu[a0000010] HASHMAP 0x804a953c(process-ID) INIT SUCCESS
npu[a0000010] DATABASE 0x804aa228(task-desc) INIT SUCCESS
npu[a0000010] DATABASE 0x804aa1ec(memory-mgt) INIT SUCCESS
init pnna lite, driver version=0x00010f00...
cid=0xb1, device_count=1
  device[0] core_count=1
input 0 dim 416 416 3 1, data_format=2, quant_format=2, name=input[0], scale=0.003922, zero_point=0
ouput 0 dim 13 13 255 1, data_format=2, name=uid_64_out_0, scale=0.112487, zero_point=190
ouput 1 dim 26 26 255 1, data_format=2, name=uid_75_out_0, scale=0.096643, zero_point=207
memory pool size=2796800byte
network core count=1
start to run network=network_binary.nb, times=0, input_address=0xe1000000
run network done...
profile inference time=0.001000ms, cycle=9485424
boxes number: 10
2 0.460957 0.775011 0.223272 0.305353 0.176144
16 0.902439 0.289818 0.642779 0.259141 0.637094
1 0.732628 0.423077 0.504524 0.660328 0.612339
7 0.745452 0.759695 0.218838 0.341707 0.176144
Destroy resource network items.

网络推理结果:

2 0.460957 0.775011 0.223272 0.305353 0.176144
16 0.902439 0.289818 0.642779 0.259141 0.637094
1 0.732628 0.423077 0.504524 0.660328 0.612339
7 0.745452 0.759695 0.218838 0.341707 0.176144

每列分别表示目标类别、置信度、中心点坐标x、中心点坐标y、框的宽、框的高


Author : @xun