正文
大家好,我是bug菌~
Zephyr这个嵌入式实时操作系统其实挺早就听说了,但渐渐发现越来越多的伙计开始学习研究了,更让我没想到的是这个操作系统已经有接近10周年了。
既然大家都开始卷这个系统,我至少也得花点时间来了解了解了,研究一下为啥在RTOS满大街的今天,Zephyr的使用却保持着非常好的增长态势呢?特别是在资源受限的设备上,Zephyr 的市场份额正在稳步提升,那这样看来在技术这块的优化它应该还是有一定的竞争优势。
1
什么是Zephyr?
Zephyr 是由 Linux 基金会托管的开源实时操作系统(RTOS),专为资源受限的嵌入式设备设计,包括微控制器、传感器、可穿戴设备和小型工业控制器等。
该系统于 2014 年由英特尔发起,2016 年作为 Linux 基金会项目正式面向公众启动,得到了 Synopsys、NXP 和 Wind River 的大力支持。
Zephyr 的设计理念是成为物联网时代资源有限的中小型设备的最佳开源软件平台,同时十分强调安全(包括信息安全与功能安全)设计。作为一个跨平台的物联网软件平台,Zephyr 支持多种处理器架构,包括 x86、ARM以及最近发展迅速的 RISC-V,目前已支持超过 800种开发板。
该操作系统采用 Apache 2.0 开源许可证,这使得它在非商用和商用解决方案中都可免费使用,为开发者提供了极大的灵活性。Zephyr 的核心优势在于其高度可配置性、模块化设计和强大的硬件抽象能力,能够让开发者编写一次应用程序,然后在不同架构和厂商的设备间无缝扩展。
Zephyr 的 GitHub 仓库星标数已超过 14,000 个,远高于竞争对手 ThreadX 的 3,300 个。在所有 RTOS 中,Zephyr 拥有最多的贡献者和提交次数,超过了 Mbed、RT-Thread、NuttX 和 RIOT 等其他开源 RTOS。
2
技术特性
其实现代一点的RTOS都借鉴了非常多Linux的方法与思想,比如引入 Kconfig 配置系统和 Kbuild 构建系统,CMake 包系统,建立设备模型等,那为啥不直接用Linux算了,可能还是因为Linux太庞大,轻量级MCU还是吃不消,所以有Linux基础的开发者应该熟悉起来更加容易上手。
那么接下来谈几个Zephyr优化得不错的几个方面:
1、内存管理优化
Zephyr 采用了多层次的内存管理架构,针对资源受限环境进行了专门优化。其内存管理系统提供了三种核心机制:堆(Heap)、内存池(Slab)和共享多堆(Shared Multi-Heap),覆盖从通用动态分配到专用内存区域管理的全场景需求。
2、功耗管理改进
功耗管理这在很多RTOS中并不常见,一些不错的功耗策略要实现起来还是挺费劲的,Zephyr 在功耗管理方面进行了深入优化,特别针对电池供电的物联网设备设计了高效的低功耗机制。其低功耗调度机制贯穿于内核调度器、系统时钟与电源管理模块之间,在轻载场景下,CPU 可在数秒甚至数分钟内保持深度睡眠状态。
Zephyr 实现了 tickless 内核模式,这是一种自适应的时钟管理技术。在系统空闲时,tickless 模式可以停止周期性的时钟中断,从而降低 CPU 功耗。Zephyr 还支持多层次的睡眠状态,从简单的 idle 状态到深度睡眠状态。最后是动态时钟频率调整,允许系统根据负载情况动态调整 CPU 频率。
3、启动时间与运行效率提升
Zephyr 系统初始化过程采用模块化设计,可以根据应用需求选择启用的模块,避免不必要的初始化开销。同时,Zephyr 支持将常用的初始化代码放在特殊的段中,在启动时并行执行,进一步缩短启动时间,所以它的设计也是考虑了一些对启动有要求的应用场景。
Zephyr 的调度器采用优先级驱动的抢占式调度算法,支持多种调度器实现以适应不同的应用场景,根据你需求选择最优调度器,
调度算法支持:协作式和抢占式调度/最早截止时间优先(EDF)调度/速率单调调度(RMS)/时间片轮转
调度器支持:简单链表就绪队列(CONFIG_SCHED_SIMPLE)/红黑树就绪队列(CONFIG_SCHED_SCALABLE)/传统多队列就绪队列(CONFIG_SCHED_MULTIQ)
4、开发工具链完善、文档齐全
West 是 Zephyr 开发的元工具,提供了统一的命令行接口来管理多个代码库。West 的设计灵感来自 Google repo 工具和 git submodules,具有扩展性,可以编写自己的扩展命令来为 West 添加功能,还是挺现代的工具。
Zephyr 从 Kbuild 迁移到 CMake 是一个重大的技术进步,整个构建流程由 west build 命令触发,背后调用的是 Zephyr 提供的顶层 CMakeLists.txt 入口文件,该文件通过一系列嵌套的 add_subdirectory () 指令递归加载内核、库、驱动、应用等子模块。
文档也有中文版的,挺齐全挺贴心的。
5、集成开发环境支持
官方文档提供了 Visual Studio Code 和 CLion 的设置指南。Visual Studio Code 的 Zephyr 扩展提供了代码导航、智能补全、调试支持等功能。CLion 作为专门的 C/C++ IDE,与 Zephyr 的 CMake 构建系统无缝集成,提供了优秀的开发体验。
6、API 标准化与易用性
Zephyr 在 API 设计和标准化方面进行了大量工作,提供了清晰、一致且易用的编程接口。Zephyr 为各种硬件设备提供了标准化的 API 接口,Zephyr 的网络功能提供了 BSD 套接字兼容的 API,允许使用众所周知的跨平台 API 编写 / 移植简单的网络应用程序。
7、内存保护机制
系统支持基于 MPU(内存保护单元)或 MMU(内存管理单元)的硬件实现,用户模式线程的堆栈缓冲区访问将通过与底层内存保护硬件部分相关的策略进行控制,支持用户态和内核态的分离,这种设计限制了潜在的安全漏洞影响范围,即使应用程序出现问题也不会影响整个系统的稳定性。
Zephyr 提供了堆栈溢出检测机制,通过在堆栈末尾放置 "哨兵" 值并定期检查来实现。它定义了一组内存分区的集合。每个内存域可以配置不同的访问权限,如只读、读写、执行等。
8、加密与认证支持
支持使用 MCUboot 作为安全启动加载器。MCUboot 提供了图像验证、签名检查、加密存储等功能。集成了多种 OTA 更新机制,Zephyr 提供了完整的密钥管理框架,支持密钥的生成、存储、使用和轮换。
整体看来Zephyr功能还是非常齐全的,功能多的就需要你会裁剪会配置,不然系统就显得很臃肿,毕竟在轻量级MCU上跑的都是相对比较单一应用场景的软件。
最后
好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个赞~
唯一、永久、免费分享嵌入式技术知识平台~
推荐专辑 点击蓝色字体即可跳转
☞MCU进阶专辑
☞嵌入式C语言进阶专辑
☞“bug说”专辑
☞专辑|Linux应用程序编程大全
☞专辑|学点网络知识
☞专辑|手撕C语言
☞专辑|手撕C++语言
☞专辑|经验分享
☞专辑|电能控制技术
☞专辑 | 从单片机到Linux