3、开发环境准备:安装nRF Connect SDK、Segger Embedded Studio、命令行工具链,配置Zephyr RTOS与TinyML依赖库
nRF52840/nRF5340 等 Nordic 平台的 TinyML 开发,本质上是在 Zephyr RTOS 之上构建一个包含传感器驱动、神经网络推理引擎和低功耗管理策略的完整固件工程。开发环境的搭建质量直接决定了后续源码编译、固件烧录、功耗测量和测试文档生成的效率。本章将围绕 nRF Connect SDK(nRF Connect SDK,简称 NCS)的安装、Segger Embedded Studio(SES)的配置、命令行工具链的搭建,以及 Zephyr RTOS 与 TinyML 依赖库(TensorFlow Lite Micro、CMSIS-NN 等)的集成展开,帮助您构建一套可复现、可维护的工程基础。
上图展示了从主机开发环境到目标硬件之间的完整工具链链路。在后续内容中,我们将按照“核心原理 → 操作流程 → 案例拆解 → 常见误区”的结构,逐步讲解每个环节的具体配置方法与验证手段。
3.1 核心原理:NCS、Zephyr 与 TinyML 的层次关系
nRF Connect SDK 是 Nordic 基于 Zephyr RTOS 构建的软件开发套件,它并非一个独立的操作系统,而是对 Zephyr 内核、Nordic 外设驱动、协议栈(BLE、Thread、Zigbee)以及第三方库(如 TensorFlow Lite Micro)进行了集成与封装。理解这一层次关系是配置环境的前提。
| 层次 | 组件 | 作用 | 配置方式 |
|---|---|---|---|
| 应用层 | 用户代码(main.c、model.cc) | 业务逻辑、推理调用、功耗策略 | 源码编写 |
| 中间件层 | TensorFlow Lite Micro、CMSIS-NN | 神经网络推理、算子优化 | west manifest / CMakeLists.txt |
| 内核层 | Zephyr RTOS(调度、IPC、电源管理) | 任务调度、低功耗 tickless 模式 | Kconfig(prj.conf) |
| 驱动层 | Nordic HAL、传感器驱动(BMI270、MPU6050) | 外设寄存器操作、中断处理 | DeviceTree(.dts / .overlay) |
| 硬件层 | nRF52840 / nRF5340 SoC | ARM Cortex-M4 / M33 执行单元 | 板级定义(board) |
在 TinyML 场景中,Zephyr 的电源管理框架(Power Management)与 TensorFlow Lite Micro 的 Arena 内存分配机制需要协同工作。例如,在推理间隙进入 System OFF 模式时,必须确保模型权重所在的 Flash 区域不被意外访问,同时保留推理所需的 RAM 上下文。这种协同关系必须在环境配置阶段就通过 Kconfig 选项和链接脚本进行约束。
3.2 操作流程:从零搭建完整开发环境
以下操作流程以 Ubuntu 22.04 LTS 为例(Windows 与 macOS 的差异会在注意事项中说明),分为四个阶段:基础工具安装、NCS 获取、SES 配置、TinyML 依赖验证。
阶段一:安装系统级依赖与命令行工具
# 更新系统并安装基础工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y git cmake ninja-build gperf ccache dfu-util device-tree-compiler wget \\
python3-pip python3-setuptools python3-tk python3-wheel xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev
# 安装 west 工具(Zephyr 的元工具)
pip3 install --user west
echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc
source ~/.bashrc
# 安装 GNU Arm Embedded 工具链(10.3-2021.10 或更新版本)
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
tar xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
sudo mv gcc-arm-none-eabi-10.3-2021.10 /opt/
echo 'export PATH=/opt/gcc-arm-none-eabi-10.3-2021.10/bin:"$PATH"' >> ~/.bashrc
source ~/.bashrc
# 验证工具链
arm-none-eabi-gcc --version
阶段二:获取 nRF Connect SDK 并初始化 Zephyr
# 创建 NCS 工作目录
mkdir ~/ncs && cd ~/ncs
# 获取 NCS v2.5.0(推荐用于 TinyML 稳定开发)
west init -m https://github.com/nrfconnect/sdk-nrf --mr v2.5.0
cd nrf
west update
# 导出 Zephyr 环境变量
west zephyr-export
# 安装 Python 依赖(NCS 自动生成 requirements.txt)
pip3 install --user -r zephyr/scripts/requirements.txt
pip3 install --user -r nrf/scripts/requirements.txt
阶段三:安装 Segger Embedded Studio(SES)
SES 是 Nordic 官方推荐的 IDE,其优势在于对 nRF 系列芯片的调试支持完善,且内置功耗分析工具(Energy Profiler)。安装步骤如下:
- 从 Nordic 官网下载 SES for ARM(Linux 版本为 .tar.gz 包)。
- 解压到
/opt/SES目录,并添加可执行权限。 - 在 SES 中配置 J-Link 路径:
Tools → Options → J-Link,指向 J-Link SDK 安装目录。 - 导入 NCS 工程时,选择
File → Open nRF Connect SDK Project,SES 会自动识别 west workspace。
J-Link RTT Viewer,通过 RTT 通道输出日志,避免 UART 占用过多 CPU 时间。
阶段四:配置 TinyML 依赖库(TensorFlow Lite Micro)
NCS 的 manifest 文件(west.yml)中已经包含了 TensorFlow Lite Micro 的引用,但需要显式启用。在应用工程的 CMakeLists.txt 中添加:
# 启用 TFLite Micro 模块
set(TFLITE_MICRO_DIR ${ZEPHYR_BASE}/../modules/lib/tflite-micro)
add_subdirectory(${TFLITE_MICRO_DIR} tflite-micro)
# 链接 CMSIS-NN 优化库(可选,提升推理速度)
if(CONFIG_TFLITE_MICRO_CMSIS_NN)
target_link_libraries(app PRIVATE cmsis-nn)
endif()
在 prj.conf 中配置相关 Kconfig 选项:
# 启用 TFLite Micro 支持
CONFIG_TFLITE_MICRO=y
CONFIG_TFLITE_MICRO_INTERPRETER=y
CONFIG_TFLITE_MICRO_ALLOCATOR=y
# 启用 CMSIS-NN 优化(若硬件支持)
CONFIG_TFLITE_MICRO_CMSIS_NN=y
# 调整 Zephyr 内存池大小(TinyML 推理需要较大 RAM)
CONFIG_MAIN_STACK_SIZE=8192
CONFIG_HEAP_MEM_POOL_SIZE=32768
3.3 案例拆解:基于 nRF52840 DK 的唤醒词检测工程环境验证
为了验证环境配置的正确性,我们以一个简单的关键词识别(KWS)工程为例,演示从编译到烧录的完整流程。该工程使用 TFLite Micro 运行一个 20KB 的语音唤醒模型,通过 PDM 麦克风采集数据。
初始现象: 编译时出现 undefined reference to tflite::MicroInterpreter::MicroInterpreter 错误,说明 TFLite Micro 库未正确链接。
分析过程: 检查 CMakeLists.txt 发现未添加 add_subdirectory 调用,且 prj.conf 中缺少 CONFIG_TFLITE_MICRO=y。进一步检查 west.yml,确认 NCS v2.5.0 的 manifest 中 TFLite Micro 模块路径为 modules/lib/tflite-micro。
解决步骤:
- 在
CMakeLists.txt中正确添加 TFLite Micro 子目录。 - 在
prj.conf中启用 TFLite Micro 相关配置。 - 重新运行
west build -b nrf52840dk_nrf52840。
结果对比: 编译通过,生成的 merged.hex 大小为 128KB,烧录后通过 RTT 日志确认推理输出正确。功耗测量显示,在待机模式下电流为 2.1μA,推理时峰值电流为 4.8mA,符合预期。
3.4 常见误区与总结复盘
在环境配置过程中,以下问题出现频率最高,需要特别留意:
| 误区 | 现象 | 根因 | 解决方案 |
|---|---|---|---|
| west 版本不匹配 | west update 失败或 manifest 解析错误 | NCS v2.5.0 要求 west ≥ 0.14 | 执行 pip3 install --user west==0.14.0 |
| 工具链路径未生效 | 编译时提示找不到 arm-none-eabi-gcc | PATH 未正确导出 | 检查 ~/.bashrc 中的 export 语句 |
| Zephyr 环境变量缺失 | west build 提示 ZEPHYR_BASE 未定义 | 未执行 west zephyr-export | 在 NCS 根目录执行该命令 |
| TFLite Micro 内存溢出 | 链接时 region RAM overflowed | Arena 大小配置过大 | 调整 CONFIG_HEAP_MEM_POOL_SIZE 或使用静态 Arena |
| CMSIS-NN 编译错误 | arm_math.h 找不到 | CMSIS 库未正确包含 | 在 CMakeLists 中添加 include_directories(${CMSIS_INCLUDE}) |
gcc-arm-none-eabi 包版本较旧,可能导致 Zephyr 内核编译失败或产生未定义行为。务必使用 ARM 官方发布的 10.3 及以上版本。