目录
目录README.md

裸机模型部署

概述

DSP 做主控时,通过 pnna_driver 驱动,在 Pnna 上部署应用程序。


环境搭建

环境要求

  • 目标板: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/app_baremetal_dsp.git
  2. 打开CCS7.4

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

  4. 选择 Select search-directory -> Browse… -> 选择 app_baremetal_dsp 文件夹

  5. 勾选 Copy projects into workspace

  6. Finish

整个目录文件夹如下所示:

project
  ├── m6678ne                  /* 板级支持包 */
  │   ├── include
  │   └── src
  ├── examples                 /* 完整的示例工程 */
  │   ├── postprocess
  │   ├── resource
  │   ... 
  |   └── yolov4_tiny_demo.c
  ├── pnna                    /* lite 驱动头文件和库文件 */
  │   ├── include
  │   └── lib
  ├── m6678ne.ccxml           /* 描述和配置调试器连接信息 */
  └── m6678ne.cmd             /* 内存布局和程序段在内存中的放置情况 */

编译工程

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

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

编译完成后,在 Debug 目录下会生成可执行程序:project.out

连接至目标板

  1. CCS界面选择View->Target Configurations,显示 Target Configurations 小窗口,选择 Projects 下project中的 m6678ne.ccxml文件,即 project 工程下的 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 一栏中选择 project/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 一栏中选择 project/resource/input_0.dat
  3. File Type 一栏中选择 Binary
  4. 点击:Next >
  5. Start Address 一栏中填写NBG存放地址:0xE1000000
  6. 点击:Finish

运行程序

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

输出结果

程序运行结果如下所示,结果分别表示:目标类别、置信度、中心点坐标x、中心点坐标y、框的宽、框的高

start to run network=network_binary.nb, times=1
run network done...
profile inference time=0.000000ms, cycle=9392210

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

流程解释

NBG和input

  1. NBG和input在 nn_api.h 文件中的定义:

    extern uint32_t *network_address;        //NBG
    extern uint32_t *input_dat0_address;     //input_0.dat
    extern uint32_t *input_dat1_address;     //input_1.dat
    extern uint32_t  my_network_size;        //yolov4-tiny NBG
    extern uint32_t  my_input_size;          //yolov4-tiny input_0.dat

    其中:

    • my_input_size 输入图片二进制的大小
    • my_network_size 网络模型文件NBG的大小。大小根据windows下,文件的属性->常规->大小确定。
    • network_address NBG文件存放内存位置
    • input_dat0_address 输入图片存放内存位置
    • input_dat1_address 输入图片存放内存位置 (2个输入循环推理的时候可以用到)
  2. 在 main() 函数中赋值

    network_address    = (uint32_t *)0xE0000000;
    input_dat0_address = (uint32_t *)0xE1000000;
    input_dat1_address = (uint32_t *)0xE2000000;
    my_network_size    = 3816092;               
    my_input_size      = 519168;    
  3. 根据NBG文件和图片的二进制文件大小,分别修改 my_input_size 和 my_network_size 中的值。

  4. 示例中不需要修改。如果更改了参数,则需要重新编译工程。

  5. 如果需要更换其他数据类型的网络模型,需要替换文件中 MY_INPUT_SIZE 和 MY_NETWORK_SIZE,同时重新下载 input_0.dat 和 network_binary.nb 即可。

  6. 程序只能推理二进制文件,并且 NBG 文件和输入文件都是在程序开始运行前,通过仿真器,先加载至 DDR 的固定位置。

应用程序推理流程

  1. 应用程序读取待处理数据,根据数据类型进行预处理操作,选择是否需要归一化和量化。
  2. 预处理操作完成后将待推理数据和NBG文件交给Pnna核进行推理。
  3. 推理完成后将数据进行反量化操作,并根据模型类型进行相应的分类或检测等处理。
  4. 最后输出结果。

整体流程

  1. 通过 CCS 编译推理工程
  2. 将 NBG 文件和待推理数据传输至板卡上的 DDR 固定位置
  3. 板卡上主控制器(CPU / DSP)根据可执行程序内容,将 DDR 固定位置的 NBG 文件和待处理数据通过驱动加载至 Pnna 核上运行,处理完成后通知主控制器到固定地址取回结果
  4. 在运行网络模型示例程序前,需要先连接至目标板并初始化DDR。

Author : @xun
关于

DSP端pnna推理示例程序

384.0 KB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

©Copyright 2023 CCF 开源发展委员会
Powered by Trustie& IntelliDE 京ICP备13000930号