保姆级教程 | i.MX 93开发板适配Zephyr RTOS全解析
飞凌嵌入式
2026-04-28 11:25:00
i.MX 93开发板
Zephyr RTOS
Zephyr是Linux基金会旗下开源实时操作系统(RTOS),由Intel、NXP、Google、Qualcomm等头部厂商持续支持,现已迭代至v4.x。它支持700余款开发板与主流处理器架构。
Zephyr 不是传统 RTOS 的替代品,而是将云计算时代的开发理念引入资源受限的嵌入式世界——解决碎片化、安全性和开发效率问题的下一代基础软件,它的设计理念是:模块化、可裁剪、开箱即用。
i.MX 9352作为NXP推出的轻量级边缘AI处理器,集成2个Cortex-A55核和1个Cortex-M33实时核,其架构设计充分体现了对实时性与复杂任务处理能力的兼顾。为了帮助开发者充分利用i.MX 9352 M33核的实时能力,结合VSCode+MCUX扩展的完整开发体验,本文将介绍如何在Zephyr中完成M33核PWM驱动的验证,帮助读者快速上手 Zephyr 在工业级 SoC 上的移植与测试实践。
演示平台:飞凌嵌入式OK-MX9352-C开发板
飞凌嵌入式OK-MX9352-C工业级开发板
1 为什么选择Zephyr?
1.1 相比传统RTOS,Zephyr的核心优势
| 特性 | Zephyr | 传统 RTOS |
|---|---|---|
| 硬件描述 | 设备树(DTS),与代码解耦 | 头文件 / 宏定义硬编码 |
| 多核支持 | 原生支持 AMP/SMP | 需自行实现 |
| 驱动框架 | 统一 API,可移植 | 厂商私有 HAL |
| 测试框架 | 内置 ztest和twister | 通常依赖外部框架 |
| 社区活跃度 | 700+ 板卡,每月数百次提交 | 多数依赖厂商维护 |
| 工具链 | west 元工具,VSCode 一键集成 | 各厂商独立工具 |
从"写代码配置硬件"到"声明硬件关系"
传统痛点:每换一个MCU引脚或外设,就要重写驱动、调寄存器、改编译选项。Zephyr以Devicetree硬件蓝图(.dts)描述整个硬件布局,更换硬件只需修改蓝图,核心业务代码几乎不动;搭配Kconfig图形化配置工具,可像 Linux 内核一样灵活裁剪系统功能。
从"功能实现"到"安全与功耗原生设计"
传统痛点:传统RTOS的安全、低功耗能力多为后期追加功能,漏洞多、优化难度大。Zephyr从底层设计就以安全为核心,覆盖安全启动链、MPU内存保护、加密服务等全链路安全能力;基于事件驱动的电源管理框架,可实现微安级精准功耗控制。
从"单一固件"到"可移植的软件资产"
传统痛点:A公司芯片写的驱动,在B公司芯片上几乎要重写。Zephyr 统一设备模型,驱动一次开发可跨厂商芯片复用;蓝牙、Wi-Fi、Matter等协议栈即插即用,与硬件底层隔离,让核心代码成为可复用、可迭代的软件资产。
1.2 Zephyr vs FreeRTOS
Zephyr和FreeRTOS都属于实时操作系统,且都面向物联网场景深化布局,但二者在软件架构、内核设计上有明显差异。
核心设计哲学
| FreeRTOS | Zephyr | |
|---|---|---|
| 核心理念 | 微内核调度器,提供核心实时调度功能 | 完整集成式操作系统平台 |
| 系统定位 | "调度器核心" + 第三方库集成模式 | "开箱即用"的完整RTOS解决方案 |
| 设计目标 | 极致轻量、高可移植性 | 功能完整、高度可配置、标准化 |
| 构建理念 | 提供构建块,用户自行组合 | 提供完整框架,用户按需裁剪 |
| 适用规模 | 小到中等规模项目 | 中小到大型复杂系统 |
系统架构
| FreeRTOS | Zephyr | |
|---|---|---|
| 调度策略 | 定优先级抢占式调度 | 抢占式 + 协作式 + 时间片轮转,动态优先级 |
| 内存管理 | 动态分配为主(pvPortMalloc),多种heap方案 | 默认静态分配,支持slab/buddy系统,强调确定性与防碎片 |
| 硬件抽象 | 通过 port 层手动移植(需写汇编上下文切换) | 基于设备树(Device Tree)自动配置外设 |
| 多核支持 | 需SMP分支或第三方移植 | 原生支持SMP(对称多处理)和AMP |
| 内存保护 | 有限MPU支持(FreeRTOS-MPU) | 完整MPU/MMU支持,用户/内核态分离 |
| 中断处理 | 中断服务例程(ISR) | 中断服务例程+中断下半部(软中断) |
| 同步机制 | 队列、信号量、互斥量、事件组 | 信号量、互斥量、条件变量、事件标志、消息队列、邮箱、管道 |
协议栈与功能
| FreeRTOS | Zephyr | |
|---|---|---|
| 网络协议 | 需FreeRTOS+TCP(额外组件) | 内置IPv4/IPv6、CoAP、MQTT、LwM2M、HTTP |
| 无线协议 | 需单独集成 | 原生支持BLE 5.4、Thread、Wi-Fi、LoRa、IEEE 802.15.4、Zigbee |
| 安全协议 | 需集成mbed TLS或AWS IoT SDK | 原生mbedTLS集成,硬件加密加速 |
| 文件系统 | 需FatFS或LittleFS集成 | 原生USB设备/主机栈 |
| CAN总线 | 无标准框架,需自行实现 | 原生CAN Socket API(类Linux SocketCAN) |
| USB协议栈 | 依赖厂商SDK或第三方 | 原生USB设备/主机栈 |
| OTA更新 | 依赖AWS IoT Jobs或自研方案 | 内置MCUboot + A/B分区OTA |
资源占用(Cortex-M4最小核无外设)
| FreeRTOS | Zephyr | |
|---|---|---|
| 最小 Flash | 5–10 KB Flash | 32–64 KB Flash |
| 最小 RAM | 2–4 KB RAM | 8–16 KB RAM |
| 上下文切换时间 | ~0.8 μs | ~1.2 μs |
开发环境与调试
| FreeRTOS | Zephyr | |
|---|---|---|
| 系统构建 | Makefile / IDE工程(如Keil、IAR) | vscode,CMake + West(命令行工具)高度标准化 |
| 配置方式 | FreeRTOSConfig.h 头文件宏定义 | Kconfig + Device Tree(图形化menuconfig支持) |
| 调试技术 | 依靠基础日志和IDE调试器 | 内置 LOG 子系统、GDB支持、QEMU模拟器 |
| 学习曲线 | 低(API简洁,文档丰富) | 较高(west元工具,Devicetree、Kconfig、CMake 复杂度) |
根据上述对比,发现Zephyr也有以下短板:
- 学习曲线陡峭
- 资源占用更大
- 构建系统复杂
- 上下文切换性能不如 FreeRTOS
从对比能看出,Zephyr的短板主要集中在入门阶段和极致资源受限场景,一旦团队熟悉开发流程、硬件资源满足要求,这些劣势会快速弱化;而它的可移植性、安全能力、生态优势,会随着项目复杂度提升愈发明显。
1.3 Zephyr 应用场景
2 开发环境搭建(VSCode+MCUX)
2.1 工具准备
推荐使用NXP MCUXpresso for VS Code扩展,插件已内置核心能力:
- CMakePresets.json一键构建
- SEGGER J-Link / LinkServer调试支持
- 设备树可视化可直接预览 .overlay 文件
安装步骤:
- 安装VS Code编辑器
- 在扩展市场搜索并安装MCUXpresso for VS Code
- 按插件引导安装west、Zephyr SDK、arm-none-eabi-gcc工具链
2.2 工程结构
使用CMakePresets.json管理构建配置,每个应用统一如下结构:
my_app/
├── CMakeLists.txt
├── CMakePresets.json ← 指定 BOARD、构建目录
├── prj.conf ← Kconfig 全局配置
├── boards/
│ ├── imx93_evk_mimx9352_m33.overlay ← 板级 DTS 扩展
│ └── imx93_evk_mimx9352_m33.conf ← 板级 Kconfig 覆盖
└── src/
└── main.c
CMakePresets.json示例:
{
"configurePresets": [
{
"name": "debug",
"cacheVariables": {
"BOARD": "imx93_evk/mimx9352/m33",
"CMAKE_BUILD_TYPE": "debug"
}
}
]
}
在 VSCode 中,点击底部状态栏的 Build 按钮即可完成编译,无需手动敲命令。
3 设备树Overlay:Zephyr的硬件描述核心
Zephyr通过Devicetree描述硬件,板级差异通过 .overlay文件叠加,无需修改官方主DTSI文件,这也是 Zephyr 高可移植性的核心设计。
RTC 外设的 Overlay 描述
RTC(实时时钟)是工业与消费电子产品中必不可少的外设。在Zephyr中,外部RTC芯片通过I2C总线挂载,并在 .overlay文件中完整描述其连接关系,应用层只需调用统一的RTC API,无需关心底层硬件差异。
以 i.MX93 EVK 接入 EPSON RX8010 为例,overlay 需要做两件事:启用 I2C 控制器并添加 RTC 子节点,同时通过 aliases 让上层应用找到该设备:
/* boards/imx93_evk_mimx9352_m33.overlay */
&lpi2c3 {
status = "okay";
clock-frequency =; /* 400 kHz */
pinctrl-0 = <&i2c3_default>;
pinctrl-names = "default";
rx8010: rx8010@32 {
compatible = "epson,rx8010"; /* 匹配驱动 binding */
reg =; /* I2C 设备地址 */
status = "okay";
};
};
/ {
aliases {
rtc = &rx8010; /* 应用通过 "rtc" 别名访问 */
};
};
应用代码中只需:
const struct device *rtc = DEVICE_DT_GET(DT_ALIAS(rtc));
struct rtc_time tm = { .tm_year = 125, .tm_mon = 3, .tm_mday = 20 };
rtc_set_time(rtc, &tm);
rtc_get_time(rtc, &tm);
可移植性体现:若将RX8010更换为其他Zephyr支持的 RTC芯片(如DS3231、PCF8563),只需修改overlay 中的 compatible和reg,应用代码零改动。
4 驱动验证实践
本节展示在i.MX 93开发板的M33核上已完成验证的PWM驱动样例。
样例:pwm_api—使用TPM2 控制器输出PWM信号
我们通过Import Example from Repository导入pwm_api项目后
overlay 只需声明别名:
/* boards/imx93_evk_mimx9352_m33.overlay */
/ {
aliases {
pwm-test = &tpm2;
};
};
Kconfig 配置:
CONFIG_PWM=y
测试通过 pwm_set_cycles() / pwm_set()设置占空比,可用示波器验证输出波形。i.MX93的TP(Timer/PWM Module)直接映射到Zephyr nxp,kinetis-tpm驱动,无需任何自定义代码。
5 Zephyr 开发中的常用调试技巧
5.1 Kconfig配置检查
Vscode中project文件中 debug/zephyr/.config 为项目最终合并后的config内容。
5.2 设备树最终输出检查
Vscode中project文件中 debug/zephyr/zephyr.dts 为项目最终合并后的dts内容。这是排查overlay合并是否生效的最直接方式。
5.3 日志级别
CONFIG_I2C_LOG_LEVEL_DBG=y # 开启 I2C 驱动调试日志
5.4 ztest 测试框架
所有驱动样例均使用ztest框架,运行后通过串口输出结果。以PWM测试为例,烧录后串口输出如下:
*** Booting Zephyr OS build v4.1.0 *** Running TESTSUITE pwm_basic =================================================================== START - test_pwm_nsec [PWM]: 0, [period]: 2000000, [pulse]: 1000000 [PWM]: 0, [period]: 2000000, [pulse]: 2000000 [PWM]: 0, [period]: 2000000, [pulse]: 0 PASS - test_pwm_nsec in 3005 ms START - test_pwm_cycle [PWM]: 0, [period]: 64000, [pulse]: 32000 [PWM]: 0, [period]: 64000, [pulse]: 64000 [PWM]: 0, [period]: 64000, [pulse]: 0 PASS - test_pwm_cycle in 3003 ms =================================================================== TESTSUITE pwm_basic succeeded
输出说明:
- test_pwm_nsec:以纳秒为单位依次设置 50% 占空比(1.65V)、100%占空比(3.3V)、0%占空比(0V),每步保持1秒
- test_pwm_cycle:以cycle为单位重复上述三种占空比验证,period=64000cycle,pulse依次为32000/ 64000/0
- 每条[PWM]行对应一次 pwm_set()/pwm_set_cycles()调用,可用示波器或万用表在TPM2输出引脚上验证实际电压
总结
通过本次i.MX93 M33核的Zephyr移植实践,我们验证了:Zephyr原生的应用pwm_api在i.MX 93 M33核的支持过程。
Zephyr 的核心价值在于:
- 一套驱动API,覆盖所有平台——更换SoC只改overlay,不改应用代码
- 设备树驱动开发——硬件配置与软件逻辑清晰分离
- 完整的测试基础设施——ztest+testcase.yaml支持 CI/CD集成
- 安全与低功耗原生设计——不是后期补丁,是系统基础设施
- 活跃的上游社区 —— 全球超1600名贡献者,每周数百次代码合并
飞凌嵌入式OK-MX9352-C开发板基于NXP i.MX93设计开发,是一款高性能工业级硬件平台,与Zephyr RTOS适配性优异、稳定性出众,借助Zephyr的工程化能力,开发者可在飞凌嵌入式OK-MX9352-C开发板上快速完成外设驱动开发、系统移植与功能验证,大幅缩短工业产品的研发与量产周期。
对于嵌入式RTOS选型、工业级产品开发的团队而言,飞凌嵌入式OK-MX9352-C开发板+Zephyr RTOS是兼顾开发效率、系统安全与硬件可靠性的优选方案。
华北区负责人
华东区负责人
华南区负责人
中西区负责人
相关产品 >
-
FETMX6ULL-C核心板
FETMX6ULL-C核心板采用NXP i.MX6ULL处理器开发设计,是一款高性能Linux核心板,采用低功耗的ARM Cortex-A7架构,运行速度高达800MHz。iMX6ULL核心板29*40mm ,iMX6ULL这款处理器功能接口资源丰富,供货周期长。
了解详情
-
FET-MX9352-C核心板
FET-MX9352-C核心板基于NXP i.MX9352处理器开发设计, i.MX9352集成2个Cortex-A55核和1个Cortex-M33实时核,主频达1.5GHz, 原生支持8路UART、2路Ethernet(含1路TSN)、2路USB 2.0、2路CAN-FD总线等常用接口。飞凌iMX93x系列在经市场验证的 i.MX 6和i.MX 8基础上进行了升级,集成NPU 可加速边缘机器学习应用,i.MX9352核心板体积小巧,便于嵌入到您的产品中。
了解详情
-
OK-MX9352-C开发板
iMX9352是一款低功耗、低成本、高性能、通用性强的嵌入式开发板产品,iMX9352采用A核+M核多核异构架构,兼具多任务处理与实时控制,0.5 TOPS Ethos U-65 microNPU,满足边缘AI需求,2路千兆网口,其中1路支持TSN,2通道MIPI-CSI摄像头接口,引出处理器所有可引出功能,并确保信号和电源完整性,iMX9352高性能,低成本的解决方案
了解详情
-
OK-MX9596-C开发板
iMX95系列处理器的强大功能,尽在iMX95开发板。这款i.MX9596开发板以高效能、高集成度为核心,集成了丰富的功能接口,让您的产品评估和开发过程更加便捷。无论是进行原型设计、功能验证还是性能测试,iMX95开发板都能满足您的需求。其强大的计算能力和灵活的扩展性,为您的产品带来无限可能。立即体验iMX95开发板,释放您的创新潜能! 了解详情
-
FET-MX9596-C核心板
飞凌嵌入式推出基于NXP i.MX95的FET-MX95xx-C核心板,集成高性能核与实时、安全核,具备2TOPS算力NPU,支持4K编解码和图形加速,适用于边缘计算、汽车、工业物联网等领域。i.MX95核心板原生支持多种接口,开发板采用分体式设计,方便用户二次开发。飞凌作为NXP金牌伙伴,提供高性能、工业级嵌入式解决方案,助您产品快速上市,领先行业。选择i.MX95核心板,选择飞凌。
了解详情

