|
||
---|---|---|
.settings | ||
bsp | ||
ddr_init | ||
include | ||
libcpu | ||
src | ||
.ccsproject | ||
.cproject | ||
.gitmodules | ||
.project | ||
README.md | ||
m6678ne.ccxml | ||
m6678ne.cmd |
README.md
DSP 端 RT-Thread 模型部署
概述
本项目旨在为开发者提供基于DSP平台的网络模型部署参考方案,通过在 FT-6678NE 多核处理器上实现 RT-Thread 操作系统的深度适配,构建了从底层硬件驱动到上层AI推理的全栈式开发框架。
版本说明
- RT-Thread:v4.0.5
- CCS:v7.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灯亮表示连接异常,如果出现这种现象,需要重新插拔仿真器,如果重新插拔仿真器后还是有问题,需要重启目标板和仿真器。
导入工程
-
下载示例工程
git clone --recursive https://gitlink.org.cn/nudt_dsp/rt-thread.git
-
打开CCS7.4
-
打开file -> import -> C/C++ -> CCS Projects -> Next
-
选择 Select search-directory -> Browse... -> 选择 rt-thread 文件夹
-
勾选 Copy projects into workspace
-
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
连接至目标板
-
CCS界面选择View->Target Configurations,显示 Target Configurations 小窗口,选择 Projects 下 RT-Thread-405 中的 m6678ne.ccxml文件,即 RT-Thread-405 工程下的 m6678ne.ccxml 文件。
-
右键 Target Configurations 小窗口下的 m6678ne.ccxml,选择Launch Selected Configuration,会跳转至调试界面,将出现8个DSP核和1个arm核连接的Debug界面
-
选择第一个C66xx_0核,Connect Target。连接成功会在核0下方出现如下字样:
0x20B00000 (no symbols are defined)
至此,已成功连接至目标板,可下载程序至DSP核并运行,但在运行程序前,需要先初始化DDR。
初始化DDR
将 ddr_init 文件夹中的 m6678ne_ddr_init.out 可执行程序添加至 CCS 工作目录。
-
成功连接至目标板后,选择Run -> Load -> Load program... 或单击下载程序图标按钮。
-
在Program file一栏选择 m6678ne_ddr_init.out 文件,点击OK。
-
运行程序。Run -> Resume 或单击运行程序图标按钮。
-
程序最后几行打印如下,即可表示初始化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
- 在调试界面点击View->Memory Browser,找到并点击load memory 按钮
- File 一栏中选择 examples/resource/network_binary.nb
- File Type 一栏中选择 Binary
- 点击:Next >
- Start Address 一栏中填写NBG存放地址:0xE0000000
- 点击:Finish
加载待推理数据
- 在调试界面点击View->Memory Browser,找到并点击load memory 按钮,会弹出 Load Memory 小窗口。
- File 一栏中选择 examples/resource/input_0.dat
- File Type 一栏中选择 Binary
- 点击:Next >
- Start Address 一栏中填写NBG存放地址:0xE1000000
- 点击:Finish
运行程序
- 下载程序:Run -> Load -> Load program... 或单击下载程序图标按钮。
- 选择该工程Debug目录下“RT-Thread-405.out”。
- 运行程序: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、框的宽、框的高