0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在Zephyr OS上启用NPU的实用方案

恩智浦MCU加油站 来源:恩智浦MCU加油站 2026-03-09 10:37 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前两期中我们已经把所有准备工作一步步铺垫到位:

Zephyr迎来AI加速时代:NPU驱动集成从未如此简单

为Zephyr AI加速做好准备:模型转换

现在,是时候把准备工作真正转化为成果了!

今天,我们将正式在Zephyr中加入NPU软件支持,让模型不仅能“跑起来”,还能“跑得飞快”。是的,本期开始就是实战环节!

本次的适配工作将以tflite_micro/hello_world工程为基础展开。我们首先将其完整复制一份,并命名为hello_world_neutron。后续所有与Neutron NPU相关的移植步骤和配置修改,都将在这个新工程中进行。

Zephyr的移植工作我们基于tfltie_micro/hello_world工程进行,将其复制一份重命名为hello_world_neutron:

7d314970-182d-11f1-90a1-92fbcf53809c.png

一、改造思路

整体改造大致分为三个主要步骤:

开启C++/FPU/TFLM支持

添加NPU相关驱动与接口层代码

修改CMakeLists.txt让工程真正“认识” NPU

除此之外,还需要将模型文件替换为NPU可执行的版本,并手动注册Neutron自定义算子,使TFLM能够调用NPU。下面我们一步一步来。

二、工程配置

1.修改prj.conf文件,添加FPU与CXX的支持:

CONFIG_CPP=y
CONFIG_STD_CPP17=y
CONFIG_FPU=y
CONFIG_FPU_SHARING=y
CONFIG_TENSORFLOW_LITE_MICRO=y
CONFIG_MAIN_STACK_SIZE=2048
CONFIG_REQUIRES_FLOAT_PRINTF=y

三、加入NPU相关代码

NPU 的组件大致可分为两部分:

1. Neutron 与 TFLM 的接口层 2. Neutron 底层 Driver

3.1将NPU相关Driver从SDK中拷贝到工程目录中

主要分为两部分:NPU底层Driver以及NPU与TFLM的接口层代码:

a) TFLM接口层代码:

我们可以在SDK代码中的eiq ensorflow-lite ensorflowlitemicrokernels eutron路径下找到这两个文件,

一定要注意:SDK版本要和转换工具的版本一致,这里我们选择的是2.16.0版本的SDK代码以及针对于2.16.0 SDK版本的Neutron-converter.exe:

7d8ec7b2-182d-11f1-90a1-92fbcf53809c.png

将这两个文件拷贝到工程目录中:

7de677b4-182d-11f1-90a1-92fbcf53809c.png

3.2NPU底层驱动:

可以在eiq ensorflow-lite hird_party eutron路径找到:

7e3fa622-182d-11f1-90a1-92fbcf53809c.png

将其同样拷贝到工程目录下,完整的目录结构如下:

7e9c8f90-182d-11f1-90a1-92fbcf53809c.png

四、修改CMakeLists,加入NPU依赖

我们需要让工程能够正确包含头文件、链接NPU相关库,完整示例如下:

cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(tensorflow_hello_world)
# These samples use local static initialization. Since Zephyr doesn't support the
# C++ ABI for thread-safe initialization of local statics and the constructors don't
# appear to require thread safety, we turn it off in the C++ compiler.
set(NO_THREADSAFE_STATICS $)
zephyr_compile_options($<$:${NO_THREADSAFE_STATICS}>)
#头文件依赖
target_include_directories(app PRIVATE neutron/driver/include)
target_include_directories(app PRIVATE neutron/common/include)
target_include_directories(app PRIVATE neutron/source)
#库依赖
add_library(libneutron1 STATIC IMPORTED GLOBAL)
set_target_properties(libneutron1 PROPERTIES IMPORTED_LOCATION
${CMAKE_CURRENT_SOURCE_DIR}/neutron/libNeutronDriver.a)
add_library(libneutron2 STATIC IMPORTED GLOBAL)
set_target_properties(libneutron2 PROPERTIES IMPORTED_LOCATION
${CMAKE_CURRENT_SOURCE_DIR}/neutron/libNeutronFirmware.a)
add_library(libneutron INTERFACE)
target_link_libraries(libneutron INTERFACE libneutron1 libneutron2)
target_link_libraries(app PUBLIC libneutron)
#添加源文件
file(GLOB app_sources src/*)
target_sources(app PRIVATE ${app_sources})
target_sources(app PRIVATE neutron/source/neutron.cpp)

到这里,工程已经具备NPU支持能力。

五、替换模型文件

将src/目录下的model.cpp替换为你通过xxd转换得到的NPU版本模型。

模型来源应为Neutron-converter转换后的.bin,格式已经适配NPU。

7ef84f06-182d-11f1-90a1-92fbcf53809c.png

六、注册Neutron自定义算子

注册Neutron算子:

因为TFLM本身不支持Neutron算子,这里需要我们手动添加,添加方式是修改src/main_functions.cpp:

/* This pulls in the operation implementations we need.
* NOLINTNEXTLINE(runtime-global-variables)
*/
static tflite::MicroMutableOpResolver <1> resolver;
resolver.AddCustom(tflite::GetString_NEUTRON_GRAPH(),
tflite::Register_NEUTRON_GRAPH());

因Zephyr自带的模型算子类型是FullyConnected,这里将他替换为NeutronGraph,同时在文件开头添加头文件引用:

7f526a22-182d-11f1-90a1-92fbcf53809c.png

至此,所有软件工作就都完成了,接下来就是使用west工具进行编译:

west build -b frdm_mcxn947/mcxn947/cpu0

7fc2ddf2-182d-11f1-90a1-92fbcf53809c.png

七、编译,下载运行

使用west编译工程,下载运行:

80214f5e-182d-11f1-90a1-92fbcf53809c.png

当我们看到正常输出、并且没有任何错误时,就说明:

模型成功转换

Neutron NPU驱动加载成功

TFLM已正确调度NPU推理

模型已顺利跑在NPU上进行加速!

八、完整链路走通

至此,小编跨越三期,带大家完整走了一遍流程:

1. 自主训练模型

2. 使用转换工具生成NPU 可执行格式

3. 在ZephyrOS 中添加 Neutron NPU 驱动支持

4. 让模型真正跑在NPU 上加速推理

这条链路虽然步骤较多,但每一步都是构建“嵌入式AI”所必需的关键环节。

也期待未来ZephyrOS能继续完善AI支持,让NPU适配更加自动化,让开发者可以更加专注于算法本身。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 移植
    +关注

    关注

    1

    文章

    417

    浏览量

    29576
  • AI
    AI
    +关注

    关注

    91

    文章

    41964

    浏览量

    303057
  • 模型
    +关注

    关注

    1

    文章

    3873

    浏览量

    52337
  • NPU
    NPU
    +关注

    关注

    2

    文章

    391

    浏览量

    21429
  • Zephyr
    +关注

    关注

    1

    文章

    62

    浏览量

    6643

原文标题:微控制器也能跑AI: 在Zephyr OS上启用NPU的实用方案

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    当RA MCU遇见Zephyr系列(3)——Vs code中配置Zephyr集成开发环境

    RA生态工作室关注我们一篇文章介绍了如何在VScode中使用瑞萨官方插件为RA芯片创建项目与项目调试,相信大家对RAVScode中的开发有了基础的了解。当RAMCU遇见Zephyr,打通
    的头像 发表于 01-01 10:04 5241次阅读
    当RA MCU遇见<b class='flag-5'>Zephyr</b>系列(3)——<b class='flag-5'>在</b>Vs  code中配置<b class='flag-5'>Zephyr</b>集成开发环境

    如何在Zephyr OS中使用cyhal?

    我一直使用Zephyr和 CY8CPROTO-063-BLE 模块,我需要实现一个高速SPI驱动器。 不幸的是,Zephyr 驱动程序的开销使每次传输的每次 SPI 传输都有大约 25 秒的额外
    发表于 01-29 07:12

    请问如何将Zephyr OS移植到KIT_PSOCE84_EVK?

    我正试图将 Zephyr OS 移植到 KIT_PSOCE84_EVK,但官方的 Zephyr 支持板列表中并没有列出它。 所以,看来我得自己移植了。 是否有针对 Zephyr
    发表于 05-30 07:32

    请问如何在OpenVINO™工具包中启用NPU设备?

    有关在 OpenVINO™ 工具套件中启用 NPU 设备的咨询。
    发表于 03-06 07:25

    如何在NXP MCU启用D-Cache?

    我正在 NXP FRDM-MCXN947 MCU 测试 TFLite AI 模型的推理时间和性能。虽然我使用 NPU 获得了良好的性能,但在不使用 NPU 时,我的推理时间相对较慢。通过启用
    发表于 03-27 07:48

    VisionFive 2 尝试 Zephyr 时没有输出是怎么回事?

    我按照指示进行作官方文档 VisionFive 2 测试 Zephyr hello_world demo,虽然我成功编译了目标程序,但发送到 UART 后,我 tty
    发表于 02-05 06:49

    使用 VS Code 和 cortex-debug 调试运行 Zephyr OS 的 MR-CANHUBK3,是否有可供下载的 SVD 文件?

    我们想使用 VSCode 和 cortex-debug 调试运行 Zephyr OS 的 MR-CANHUBK3。需要一个 SVD 文件才能查看寄存器值。 是否有可供下载的 SVD 文件?
    发表于 04-20 11:45

    如何同时Zephyr运行RT1170 EVK 1G和100M端口?

    是否可以 Zephyr 同时使用 RT1170 EVK 的 100M 和 1G 接口?我知道 1G 接口可以使用 100M enet 驱动程序并获得 100M 速度,这很好,但是
    发表于 04-07 09:55

    如何使用RT685的DSP搭配Zephyr OS

    我使用的是 NXP MIMXRT685 EVK 板。 我正在尝试创建一个简单的程序来 DSP 和 ARM 部件之间进行通信。我 MCUXpresso 和 Xplorer IDE 使用基本示例
    发表于 05-18 08:04

    μC/OS-IIEP7312的移植

    μC/OS-IIEP7312的移植首先介绍μC/OS-II操作系统的特点,重点分析μC/OS-II
    发表于 06-16 11:24 1410次阅读
    μC/<b class='flag-5'>OS</b>-II<b class='flag-5'>在</b>EP7312<b class='flag-5'>上</b>的移植

    Chrome OS将获Linux支持,可在Chrome OS 运行Linux?

    继添加了安卓应用支持后,Chrome OS现在又将获得Linux支持。此前,IT之家报道了 Terminal(终端)应用已出现在Chrome OS的开发通道中,暗示着我们将可在Chrome OS
    的头像 发表于 06-14 08:45 4614次阅读

    浅析ZephyrESP32的启动流程

    理解Zephyr一款soc的启动流程,有利于分析和调试开机过程卡死,驱动异常等的问题。因此在上手一款新的soc时掌握Zephyr在其上面的启动流程非常必要。本文对
    的头像 发表于 06-07 17:04 7187次阅读

    泰凌微电子Zephyr编译环境搭建

    如上文所介绍,Telink Zephyr是由社区的Zephyr仓库fork而来的,用于维护我们社区的内容,并开发新的功能。若要查看 Telink Zephyr 最新的开发内容,可以查
    的头像 发表于 01-30 11:28 4948次阅读

    Sitara MPU启用Matter

    电子发烧友网站提供《Sitara MPU启用Matter.pdf》资料免费下载
    发表于 08-27 09:41 1次下载
    <b class='flag-5'>在</b>Sitara MPU<b class='flag-5'>上</b><b class='flag-5'>启用</b>Matter

    深入解析Zephyr RTOS的技术细节

    Zephyr OS嵌入式开发中的知名度逐渐增加,新的微控制器和开发板都支持Zephyr。本文将深入讨论Zephyr RTOS的技术细节。
    的头像 发表于 10-22 16:47 4898次阅读
    深入解析<b class='flag-5'>Zephyr</b> RTOS的技术细节