随着物联网设备数量越来越多,物联网操作系统的装机量也随之增加,Zephyr作为一款专门为资源受限设备推出的物联网操作系统,其具有开源性、模块化、可配置的优点,自推出以来受到越来越多的开发者的关注,并逐步被各种物联网设备所采用。为了满足物联网的碎片化需求,Zephyr操作系统尽可能支持多种架构,目前包括ARM、x86、ARC、NIOS-II、RISC-V、Xtensa六种架构,在最新的1.9.0内核版本中,Zephyr又增加了对十余种SoC的支持,内核功能更加完善。
开发者设计的系统不仅包括内核和外设寄存器定义,还包括低层无状态外设驱动程序和裸机事件驱动程序,这些都由SoC供应商维护,许可常常很宽松。然而,这些硬件系统不仅用在Zephyr中,还会用在其他项目中,系统需要更高的成熟度和质量保证测试,因此,我们需要简化向Zephyr 添加新SoC 和驱动程序的过程,帮助开发者加快产品设计,要实现这一目标,在Zephyr项目中使用SoC供应商HAL十分必要。
开发者可能会问:HAL是什么?HAL即硬件抽象层,是在具体的硬件平台上抽象出来的一个硬件接口层,这个接口层负责实现具体硬件平台的功能和控制,同时又为其它软件模块提供统一的API接口。HAL的出现就是为了将硬件操作和控制的共性抽象出来,向上层软件提供统一操控接口,以实现其它软件模块与底层硬件隔离。有了HAL后,系统在新硬件平台上的移植就变得异常简单,只需提供新硬件的抽象层即可,Zephyr操作系统通过硬件抽象层可以忽略硬件细节,以一种抽象方式来访问硬件。
不同的SoC供应商使用不同的HAL,如下图所示:
SoC供应商提供的抽象级别可以分为三类:第一,事件性HAL驱动程序,如:小巧的Zephyr shim 驱动程序、MCUX 和QMSI;第二,低层、无状态HAL 驱动程序,如:较大的Zephyr shim 驱动程序、STM32;第三,仅含寄存器定义的抽象级别,如:准原生Zephyr 驱动程序、Atmel、Nordic。
下面,我们以CMSIS和MCUXpresso SDK为例进行具体介绍。CMSIS 是由Arm定义的Cortex 微控制器系统接口标准,包括CMSIS-Core、-SVD、-DSP、-Driver 等,CMSIS-Core 标准化处理器内核访问和外设定义,Arm 提供通用的Cortex-M 头文件,供应商提供设备头文件,Zephyr 内核端口使用CMSIS 访问NVIC、SCB 寄存器,Zephyr 驱动程序使用CMSIS 访问外设寄存器。
MCUXpresso SDK通常为NXP Cortex-M MCU 启用,外设寄存器定义兼容CMSIS-Core,从与硬件文档相同的来源生成;裸机外设驱动程序为Kinetis和LPC 系列使用类似的API(UART/LPUART/LPSCI、SPI/DSPI/LPSPI 等),属于无状态和事件性抽象级别,相互依赖性极小,在所有硬件平台上都经过了测试。
需要说明的是,外部维护的源代码位于ext/ 中,包含SoC供应商HAL、mbedTLS、TinyCrypt、FatFS、SeggerRTT,许可宽松,但不一定是Apache 2.0;许多产品依据BSD 3-clause,如果按原样导入,改动极小,如果需要修改,可单独提交,不受Zephyr 编码样式约束。
导入流程
1. 将包含源代码补丁的“代码组件自述文件README”提交到TSC;
2. TSC 成员是否(通过TSC 投票)同意该提案?
否–软件被拒绝
是–TSC 主席将自述文件转发给理事会进行评审
3. 在2周评审期限内,是否有任何理事会成员对文件提出质疑
否–软件被接受,而且将自述文件包含在项目的文档中(酌情放在树和外部站点中)
是–理事会将举行会议,讨论否决TSC 提案还是找出其他方法
在Zephyr项目中添加一个新Arm SoC之前需要搞清楚几个问题:SoC 是否属于一个现有的产品家族或系列?是否有CMSIS 头文件可用?许可是否兼容?是否有事件性或无状态驱动程序可用?许可是否兼容?API 是否兼容?它们是否可用于同一个家族中的其他SoC?如果条件全部满足,就可以在Zephyr项目中添加所需要的Arm SoC。
通过以上流程可以看出,SoC供应商HAL 减少了自定义Zephyr 代码的数量,能提供不同的抽象层级,在Zephyr 中已被许多的SoC成功使用,开发者可以审阅输入流程和git历史记录,同时还可以与维护者进行交流。
不过采用SoC供应商HAL也需要权衡一些利弊,比如代码需要在别处维护,比较难以进行上游更新;许可对Zephyr是新的,或者不兼容Apache 2.0;还有就是代码在别处使用时可能出现API不兼容,功能无法实现的问题。
关于Zephyr
Zephyr 项目是一款小型且可扩展的操作系统,尤其适用于资源受限的硬件系统,可支持多种架构;该系统高度开源,对于开发人员社区完全开放,开发人员可根据需要对该系统进行二次开发,以支持最新硬件、工具和设备驱动程序;该系统高度模块化平台,可轻松集成任何架构的第三方库和嵌入式设备。