随着物联网规模越来越大,应用种类越来越多,用户对物联网设备接受度越来越高,仅提供硬件已经难以满足五花八门的市场需求。设备供应商逐渐意识到操作系统对于提高用户体验的重要性,因此多家厂商瞄准了物联网操作系统市场。为了帮助硬件供应商设计出更加具有竞争力的物联网设备,Linux基金会推出了Zephyr物联网操作系统,它是一款轻体量开源操作系统,自推出以来持续更新迭代。其中1.8.0版本将源代码迁往GitHub,1.9.0版本增加支持蓝牙Mesh,最近Zephyr项目又发布了Zephyr内核1.10.0版本。
新版本针对内核、架构、开发板等多方面进行了增强, 包括
在x86、用户空间和内存域上,初始的alpha品质线程级的内存保护;
对构建系统进行大修,并从Kbuild切换到CMake;
支持Newtron闪存文件系统(NFFS);
增加测试套件的范围,并将大部分测试实例迁移到采用Ztest;
与MCUBOOT引导加载程序进行集成;
为很多已经支持的平台增加SoC、平台和驱动程序支持;
内核:增加多种面向内存域的API
该版本内核删除了弃用的k_mem_pool_defrag代码,在x86、用户空间和内存域上,初始alpha品质线程级的内存保护,包括:内核和用户模块线程采用相同内核及驱动程序API;提升系统调度权限;堆栈溢出保护;内核对象和设备驱动程序权限跟踪;简单的应用程序vs内核内存分离;用于微调内存区域权限的内存域API;来自其它线程的堆栈内存保护。除此之外,还增加使用内核堆的k_calloc()去实现传统的calloc() 语意;以及引入对象验证机制,从用户空间做的所有系统调用,包括指向内核对象的指针(包括设备驱动程序),将需要这些指针验证;用户空间必须永远不能通过传递垃圾摧毁内核。
其中所添加的面向应用程序的内存域API列表如下:
k_mem_domain_init():初始化内存域;
k_mem_domain_destroy():销毁内存域;
k_mem_domain_add_partition():将分区添加到域中;
k_mem_domain_remove_partition():从域中删除分区;
k_mem_domain_add_thread():将线程添加到域中;
k_mem_domain_remove_thread():从域中删除线程;
支持架构更新,增加四种ARM SoC
在架构方面,针对nrf52增加支持LOW_POWER状态和SYSTEM_OFF,增加了特定架构内存域的API,针对Xtensa的Tickless内核执行。基于ARM架构的处理器在物联网设备中得到快速应用,因此,该版本所支持的ARM SoC增加了四种,包括:NXP i.MX RT1052、Silabs EFM32WG、STM F0和TI MSP432P4xx。
支持的ARM开发板持续增加
面对物联网应用的碎片化现状,设备制造商尽力采用满足不同需求且性价比高的开发板,这也同时要求物联网操作系统尽可能扩大支持范围。为了最大限度满足客户的设计需求,1.10.0内核版本开始支持Jaihouse接口,该接口将使Zephyr能够在x86-64系统上作为客户操作系统运行;并且增加针对nrf52系列SOC的电源管理;同时,所支持的ARM开发板又增加了10种,列表如下:
96b_neonkey
efm32wg_stk3800
mimxrt1050_evk
msp_exp432p401r_launchxl
nucleo_f030r8
nucleo_f091rc
stm32f411e_disco
stm32f412g_disco
stm32l476g_disco
usb_kw24d512
支持更多传感器,让物联网设备的神经系统更发达
传感器是物联网设备的感触神经,可以帮助其采集数据,做出正确的分析处理,因此物联网设备离不开传感器。新的Zephyr 内核版本增强了对驱动器和传感器的支持:针对定时器,在xtensa_sys_timer中增加对TICKLESS KERNEL的支持;将随机random重命名为熵entropy;增加Atmel SAM I2S(SSC)、Atmel SAM DMA(XDMAC)、plantowerPMS7003等驱动程序;为JTAG UART软件IP增加Altera垫片驱动程序;为定时器软件IP增加Altera垫片驱动程序;引导mcuxccm驱动程序和mcuxigpio垫片驱动程序。
针对网络增加多种库,方便用户调用
新的内核版本在网络支持方面做了多种修复,增加多个库函数,方便用户设计时进行调用。其中HTTP API更改为使用net-appAPI,旧的HTTP API被弃用;增加支持环回网络接口(这仅用于测试);增加支持LWM2M多碎片网络数据包;新的CoAP库实现,支持更长的网络数据包;弃用ZoAP库;增加支持mDNS(多播DNS);增加SNTP(简单的网络时间协议)客户端库;针对TCP, RPL, ARP, DNS, LWM2M, 以太网, net-app API, 网络外壳、BSD 套接字API的各种修复;同时还针对网络管理API、网络样品应用程序、网络样品应用程序、IEEE 802.15.4通用等进行修复,避免设计过程中出现不必要的错误。
加强对蓝牙的支持,简化开发者设计
蓝牙联盟宣布支持Mesh网络以后,在业内引起了不小的轰动,物联网设备作为Mesh网络的重要组网成员,支持蓝牙Mesh必不可少,新版本针对蓝牙Mesh进行多项支持。包括:对蓝牙Mesh多个资格相关的修复;支持蓝牙Mesh朋友节点角色;支持蓝牙Mesh基础客户端模块;新蓝牙Mesh外壳模块和测试应用程序;在BLE控制器中支持PA/LNA放大器;在BLE控制器中支持附加的VS命令;为BLE控制器多个稳定性修复程序,一系列的更新更便于工程师进行蓝牙方面的开发。
构建和基础设施迁移到CMake
从1.10版本开始,Zephyr项目已经迁移到CMake,这个努力对于那些需要不同平台和不同开发环境的开发人员是重要的一步,这使Zephyr更易于被应用开发人员使用。这一更改保持了Kconfig原样,并用相应的CMakeList.txt替代所有的Makefile。Kbuild提供的类似于DSL的Make语言被一组CMake扩展所替代,这些扩展提供了简单的一对一Kbuild的功能的翻译,或引入了新的概念替代Kbuild概念。开发者在使用之前,请重新阅读入门指南,其中包括有关在主机OS上进行设置和开发的更新的指令说明,你需要将自己的树外脚本和Makefiles移植到CMake。
库/子系统更丰富,代码风格得到清理
sys_rand32_get()函数的实现已经被移动到一个新的“随机”子系统。这个函数有一个新的实现,一个基于Xoroshift 128+PRING(使用一个硬件号码发生器来播种),另一个直接从数字发生器驱动程序获取随机数字。硬件号码生成器驱动程序已经被移动到一个”drivers/entropy”目录;这些驱动程序仅暴露include/entropy.h提供的接口,TinyCrypt升级到0.2.8版本。
同时,针对测试和样品,Zephyr 1.10版本还清理基准代码;添加用户空间保护测试;将所有的测试迁移到Ztest中,并且清理代码风格和格式。这就使得新版本的代码风格更加清晰,简化设计者熟悉代码的过程,让产品开发更容易。
原文参见:https://github.com/zephyrproject-rtos/zephyr/releases/tag/zephyr-v1.10.0
关于Zephyr
Zephyr 项目是一款小型且可扩展的操作系统,尤其适用于资源受限的硬件系统,可支持多种架构;该系统高度开源,对于开发人员社区完全开放,开发人员可根据需要对该系统进行二次开发,以支持最新硬件、工具和设备驱动程序;该系统高度模块化平台,可轻松集成任何架构的第三方库和嵌入式设备。