config: PNNA 框架菜单依赖 pnnacore 驱动开关,移除废弃的 jsonrpc server 示例项
驱动关闭时框架实际无法编译(缺 pnna_lite_config.h 路径),Kconfig 现强制隐藏整个菜单; jsonrpc server example 为 arm-linux 端旧入口,rtt 侧由 jsonrpc+http 取代。
Co-Authored-By: Claude Opus 4.7 noreply@anthropic.com
版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9
京公网安备 11010802047560号
pnna2 神经网络推理框架简介
概述
pnna2 目录是在 PNNA 推理框架基础上形成的应用层适配版本,主要面向新一代嵌入式硬件平台的模型推理部署需求。该目录基于 pnna_lite v2.1.6 驱动版本进行开发,适配 x16 板卡及 arm64 Linux 系统环境。
pnna2 在原 PNNA 工程结构基础上进行了整体迁移与整理,主要包括驱动接口层的统一调整,使其与新版本 pnna_lite 驱动 API 保持一致,同时保留原有的推理流程结构、示例程序与测试代码组织方式,用于支撑模型在新硬件平台上的基本部署与运行验证。
该目录主要用于承载 PNNA 在新驱动版本与新硬件平台上的应用适配实现,保持与原 PNNA 工程在使用方式上的一致性,便于上层应用进行迁移与调用。
PNNA vs PNNA2 主要差异
PNNA2 是在 PNNA 基础上的新一代适配版本,主要差异如下:
PNNA2 在应用层进行了封装优化,以适配新驱动接口与新硬件平台能力。
目录结构和说明
目录职责说明
examples examples 目录提供基于 pnna 的完整推理示例工程,覆盖不同模型和运行平台。 示例主要用于展示 pnna 接口的实际使用方式,包括模型加载、输入准备、推理调用和结果处理。 示例的详细流程和注意事项不在本 README 中展开,具体说明请参考 examples/README.md 以及各示例子目录中的文档。
include include 目录包含 pnna 对外暴露的头文件,定义了推理相关的核心数据结构、接口函数以及通用类型。 这些头文件是应用层或示例工程使用 pnna 功能的主要入口,同时也作为 src 目录中实现代码的接口约束。
src src 目录实现 pnna 的核心功能逻辑,包括模型推理流程、前后处理、工具函数以及不同运行环境下的驱动适配。 driver_metal_c6x 和 driver_rtt 子目录分别用于适配 DSP 裸机和 RT-Thread 操作系统,其余源文件实现平台无关的通用推理逻辑。
lib lib 目录用于存放 Linux 平台下的 PNNA 动态库文件(.so)。 在 ARM Linux 环境中,PNNA 驱动的编译与 Linux 内核版本、内核配置和工具链强相关,直接提供源码在多数情况下难以复用。 因此,该目录以预编译库文件的形式提供 PNNA 驱动与底层实现,供应用程序或示例工程在 Linux 平台下直接链接使用。
test test 目录用于存放 PNNA Driver 的测试代码,包含单元测试和集成测试相关内容,用于验证设备管理、buffer 管理、推理流程以及前后处理等功能的正确性。 测试框架、构建方式和运行方法请参考 test/README.md。
使用说明
pnna2 目录本身不直接作为独立工程使用,而是作为推理框架库被示例工程或上层应用引用。一般使用流程为:
PNNA 驱动部署与使用
驱动编译与部署
pnna2 的 RT-Thread 驱动位于
src/driver_rtt,其中pnna_drv为驱动主体,pnna_hal为硬件抽象层,nbg_fmt与nbg_linker负责模型解析与运行链接。驱动通过src/driver_rtt/pnna_drv/src/SConscript接入构建,并使用PKG_USING_PNNACORE作为使能开关;x16 板级代码需提供x16_psc.h/x16_pll.h中的时钟与 PSC 接口,供pnna_drv_pnnacore_vendor_x16.c完成 NPU 电源和时钟控制。编译并烧写 RT-Thread 镜像后,按以下步骤部署 YOLOv5s 示例:
示例程序会从
0xE0000000读取 NBG 模型(yolov5s_dfpi16.nb),从0xE2000000读取 CHW 格式输入数据(car.dat),再依次完成设备打开、模型创建、推理、结果打印和资源释放。地址约定
0xE0000000NBG_DDR_BASE0xE2000000IMAGE_DDR_BASE上述宏定义于
examples/yolov5s/rtt_yolov5s_demo.c。更换模型或输入数据时,请同步修改示例中对应的NBG_DDR_SIZE/IMAGE_DDR_SIZE,并确保加载地址与 DDR 内存布局不冲突、两个数据区互不重叠。驱动使用说明
RT-Thread 示例的驱动调用流程与上层 API 保持一致:
pnna_open():初始化 PNNA 驱动与硬件,启动 NPU 时钟;create_app_ctx():基于内存中的 NBG 数据创建应用推理上下文;app():执行预处理(如需)、推理与后处理;destroy_app_ctx():释放模型及推理上下文资源;pnna_close():关闭驱动并释放硬件资源。驱动启动时会在控制台打印
[PNNA] PNNALite driver v2.1.6 RT-Thread,示例程序在pnna_open()成功后打印PNNA device opened.,可用于确认驱动部署正常。其它 RT-Thread 示例(如yolov8s)的加载地址、文件类型及 MSH 命令以其各自的rtt_*.c代码为准。PNNA API 参考手册
设备管理
在进行任何推理任务前,必须先初始化硬件设备;任务结束后需释放资源。
应用上下文 (App Context) 管理
PNNA 提供高层封装的
App Context,自动管理模型加载、内存分配及前后处理回调。创建上下文
销毁上下文
执行推理
app() 函数
app()是执行推理的核心入口,封装了“预处理 -> 模型推理 -> 后处理”的完整链路。app() 是执行推理的高层接口,封装了:
preprocess()infer()postprocess()适用于希望使用统一流程的应用程序。
app() 函数参数传递说明
app()函数的第二个参数为void **output,用于返回推理结果指针。 根据是否配置后处理函数,output的实际指向对象及内存管理方式有所不同。配置后处理函数的情况
当模型配置了后处理函数时,
app()返回的结果为最终解析后的结构化数据,其具体类型由后处理函数定义,例如目标检测模型中的detection。这种模式下:
app()仅负责将结果写入调用者提供的内存示例如下:
注意事项:
output的地址(void **),而不是直接传结构体数组上述写法会导致指针层级不匹配,可能引发未定义行为。
未配置后处理函数的情况
当未配置后处理函数时,
app()不对模型输出做解析,而是直接返回网络原始输出缓冲区。这种模式下:
buffer_t *app()/ 模型内部管理示例如下:
注意事项:
output置为NULL即可app()内部会将网络输出缓冲区指针赋值给outputinfer() 函数
更细粒度的底层推理接口
infer()只执行模型推理,不包含:它是 app() 内部调用的核心底层接口,适用于:
底层模型接口说明
create_model() / destroy_model()
PNNA 提供底层模型生命周期管理接口,用于直接创建和销毁模型推理上下文。
create_model()负责:nn_ctx_t推理上下文destroy_model()负责释放create_model()创建的所有模型相关资源。App Context 与底层模型接口关系
PNNA 提供两套常用的推理调用方式,分别面向不同复杂度需求。
方式一:高层封装(推荐)
特点:
create_app_ctx()内部封装并调用create_model()destroy_app_ctx()内部封装并调用destroy_model()app()自动完成:infer())适用于:常规应用、示例工程、希望使用统一推理流程的场景。
方式二:细粒度调用(高级用法)
特点:
nn_ctx_tinfer()适用于:自定义推理流程、性能测试、多模型协同、多任务调度等高级场景。
两种方式对比
create_app_ctx()create_model()app()infer()多输入模型支持
对于具有多个输入节点的模型(如某些特定的检测或分割网络),输入数据的构造方式如下:
资源管理 API 对照表
为了防止内存泄漏,请严格遵循以下的资源创建与销毁配对规则:
pnna_open()pnna_close()load_binary_to_buffer(...)free_buffer(...)create_app_ctx(...)destroy_app_ctx(...)load_image(...)/load_image_from_memory(...)free_image_buffer(...)create_buffer_from_qparams(...)destroy_buffer_array(...)create_model(...)destroy_model(...)标准调用流程示例
pnna_open()。create_app_ctx()注册前后处理回调。buffer_t。app()。output数据进行业务处理。free_image_buffer,free(output),destroy_app_ctx()。pnna_close()。