ARM 端 RT-Thread 模型部署
文档说明
本文档面向使用 X78NE 平台的开发人员,系统性说明如何在 ARM 端基于 RT-Thread 操作系统完成 PNNA 推理示例的部署与运行。 内容覆盖环境准备、工程获取、编译构建、程序与模型加载以及推理验证,适用于首次接触该平台的用户参考执行。
开发环境与硬件准备
硬件与软件准备如下:
X78NE 开发板
电源适配器
RS232 转 USB 串口线
网线
串口调试工具
tftpd64(用于 TFTP 服务)
串口与网络环境初始化
完成以下连接与配置以确保板卡可正常启动并具备网络通信能力:
将电源、网线分别连接至开发板
使用 RS232 转 USB 线连接开发板 UART_DSP 接口与主机
在设备管理器中确认串口号
打开串口工具,配置为 115200 波特率、8 数据位、无校验、1 停止位、无流控
上电启动开发板,在 U-Boot 倒计时阶段进入命令行
进入 U-Boot 后,执行 tftpboot 命令确认板卡与主机的网络连通性,并根据提示在主机侧配置对应的 IP 地址。通过 ping 命令验证网络状态,确保通信正常。
1U-Boot 2019.01+ (Jun 20 2024 - 15:43:38 +0800)
2
3SOC: X78NE
4 CPU(ARMV7): 1600 MHz
5 DSP(C66x): 1250 MHz
6Model: X78NE EVM
7
8 mcu start work
9
10Mcu Channel 0
11/2 Bank Groups/4 Banks/10 Column/17 Row/X16/1 Ranks/ECC/Standard
12Systemp DRAM Capacity = 8GB, DDR freq = 1332MHZ
13DDR Init Done.
14
15Flash: ## Unknown flash on Bank 1 - Size = 0x00000000 = 0 MB
160 Bytes
17NAND: nand_scan failed, ret -19
180 MiB
19Net: eth0: ethernet@4200000
20Hit any key to stop autoboot: 0
21x78ne =>
输入
tftpboot命令,可以看到TFTP from server 192.168.23.111,需要我们在电脑上添加192.168.23.111这个IP
1x78ne =>tftpboot
2wait SGMII/RGMII link up ...
3Speed: 1000, full duplex
4*** Warning: no boot file name; using 'C0A81764.img'
5Using ethernet@4200000 device
6TFTP from server 192.168.23.111; our IP address is 192.168.23.100
7Filename 'C0A81764.img'.
8Load address: 0x82000000
9Loading: *
10TFTP error: 'File not found' (1)
11Not retrying...
12x78ne =>
在串口输入
ping 192.168.23.111,打印host 192.168.23.111 is alive表示网络通信正常,至此环境准备完毕
1x78ne =>ping 192.168.23.111
2wait SGMII/RGMII link up ...
3Speed: 1000, full duplex
4Using ethernet@4200000 device
5host 192.168.23.111 is alive
6x78ne =>
安装 Env 开发工具
Env 是 RT-Thread 推出的开发辅助工具,针对基于 RT-Thread 操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。
具体请参考官方文档:Env 用户手册
RT-Thread 与示例工程获取
RT-Thread 主线版本使用 v5.1.0
1git clone https://gitlink.org.cn/nudt_dsp/rt-thread-v5.1.0.git
获取 X78NE BSP 工程:
1cd rt-thread-v5.1.0/bsp
2git clone -b v20260112 https://gitlink.org.cn/nudt_dsp/x78ne.git
获取 PNNA 示例工程
1cd x78ne/armhf/applications
2git clone -b v20260112 https://gitlink.org.cn/nudt_dsp/pnna.git
构建工具与编译器配置
Env 开发工具安装完成后,在安装目录下,自带交叉编译器工具链,只需编辑 x78ne/armhf/rtconfig.py :
示例配置如下:
EXEC_PATH = r'D:\env-windows\tools\gnu_gcc\arm_gcc\mingw\bin'
工程配置与编译
在 x78ne/armhf 目录空白处,单击鼠标右键,找到:ConEmu Here
在弹出了窗口中执行:
1scons -j16
如需清理工程:
1scons -c
如需修改 RT-Thread 配置项,可先设置 RTT_DIR 环境变量后进入 menuconfig:
1set RTT_DIR=D:\rtt\rt-thread-v5.1.0
2menuconfig
编译完成后将生成 rtthread-a15.elf 与 rtthread-a15.bin 文件。
1$ scons -j16
2...
3LINK rtthread-a15.elf
4Memory region Used Size Region Size %age Used
5 MSMC_SRAM: 1788288 B 2016 MB 0.08%
6 RPMSG_SH_MEM: 64 KB 4 MB 1.56%
7arm-none-eabi-objcopy -O binary rtthread-a15.elf rtthread-a15.bin
8arm-none-eabi-size rtthread-a15.elf
9 text data bss dec hex filename
10 554523 30148 1264000 1848671 1c355f rtthread-a15.elf
11scons: done building targets.
12$
TFTP 服务配置
运行tftpd64.exe
在
Current Directory一栏填 x78ne arm 工程路径~/rt-thread/bsp/x78ne/armhf在
Server interfaces一栏选择192.168.23.111
程序与模型加载
在 U-Boot 命令行中依次加载模型、输入数据以及 RT-Thread 系统镜像::
1tftpboot 0xA0000000 ./applications/pnna/examples/yolov5s/resource/yolov5s-int16.nb
2tftpboot 0xA2000000 ./applications/pnna/examples/yolov5s/resource/car_int16.dat
3tftpboot 0x82000000 rtthread-a15.bin
4dcache flush
5go 0x82000000
系统启动成功后,进入 RT-Thread 控制台
1...
2Fined PHY Chip success, PhyAddr = 7, PhyID = 0e400141
31000Mbps FullDuplex
4[77] D/eth: gmac open
5msh />
推理示例运行与结果验证
在 msh 终端中执行 PNNA 示例命令:
1yolov5s
推理日志关键内容:
1msh >yolov5s
2...
3npu[821ce2e8] gck pnna_drv_init, video memory heap base: 0xc0000000, size: 0x04000000
4npu[821ce2e8] HASHMAP 0x0x8216c87c(process-ID) INIT SUCCESS
5npu[821ce2e8] DATABASE 0x0x8216d560(task-desc) INIT SUCCESS
6npu[821ce2e8] DATABASE 0x0x8216d52c(memory-mgt) INIT SUCCESS
7INFO init pnna lite, driver version=0x00010f00...
8 at query_hardware_info (applications\pnna\src\nn_api.c:37)
9INFO cid=0xb1, device_count=1
10 at query_hardware_info (applications\pnna\src\nn_api.c:50)
11INFO device[0] core_count=1
12 at query_hardware_info (applications\pnna\src\nn_api.c:53)
13INFO Input: [640 640 3 1], Data format: INT16, Quant format: QUANTIZE_DYNAMIC_FIXED_POINT
14 at get_input_quantize_param (applications\pnna\src\quantize.c:933)
15INFO QUANTIZE_DYNAMIC_FIXED_POINT, fl: 14
16 at get_input_quantize_param (applications\pnna\src\quantize.c:945)
17INFO Output: [85 25200 1 0], Data format: INT16, Quant format: QUANTIZE_DYNAMIC_FIXED_POINT
18 at get_output_quantize_param (applications\pnna\src\quantize.c:989)
19INFO QUANTIZE_DYNAMIC_FIXED_POINT, fl: 5
20 at get_output_quantize_param (applications\pnna\src\quantize.c:1001)
21INFO No preprocess required at create_app_ctx (applications\pnna\src\nn_api.c:124)
22create_app_ctx done
23Total detections: 5
240 0.88 42.44 230.98 193.25 540.08
250 0.88 175.69 241.36 271.75 511.14
260 0.88 532.30 229.30 639.58 519.95
270 0.59 -0.03 325.05 55.41 517.27
285 0.47 13.00 131.06 619.75 461.44
29destroy app_ctx_t done.
30pnna closed
31msh >
推理结果如下所示:
10 0.88 42.44 230.98 193.25 540.08
20 0.88 175.69 241.36 271.75 511.14
30 0.88 532.30 229.30 639.58 519.95
40 0.59 -0.03 325.05 55.41 517.27
55 0.47 13.00 131.06 619.75 461.44
运行过程中可观察到 PNNA 驱动初始化、模型加载、量化参数解析以及推理执行日志。程序结束后输出检测结果,每一行表示一个目标,字段依次为:
类别索引
置信度
左上角 x 坐标
左上角 y 坐标
目标框宽度
目标框高度
日志与结果输出表明模型已成功在 ARM 端 RT-Thread 系统上完成推理流程。
作者 @xyy xunyingya@hngwg.com, @lw 919408385@qq.com