Zephyr RTOS是什么,为什么要学,怎样学。
IoT软件开发过程中问题的提出
在我的大约15年嵌入式系统开发经历中,从AT80C51, Atmega系列,PIC16,STM8, dsPIC, TMS320F28335,再到STM32F0,F1,F4,F7的开发,使用的都是Keil,IAR,CCS,这些集成度很高的开发环境。这些高集成度IDE在传统的嵌入式开发上的效率极高。但当我进入IOT领域,面对IOT那严重碎片化的问题域时,用传统的开发方式去应对,感觉是N种选择*N种组件*N种云,虽然在KEIL/IAR中也是能用GUI来比较好地去管理RTOS、中间件、芯片和板载BSP,也有现成的可视化组件管理和代码生成器,但可视化GUI去应对N*N*N的配置复杂度,效率很低;而使用脚本去管理多变和复杂的组件和构建工程反而是最高效率的(类比于嵌入式Linux)。
又由于我最近几年有一半的时间是在linux下进行C、C++和Qt的开发,对于Linux的开发实践也越来越认同,这也是我开始关注Zephyr的最主要原因,因为如果我一直是在Windows下开发,绝不可能跳出原来的那个视野。
Zephyr RTOS是什么
zephyr操作系统是一个用于资源受限和嵌入式系统的小型内核(出自名门),针对的应用场景,从简单的嵌入式环境传感器和可穿戴设备到复杂的嵌入式控制器、智能手表和物联网无线应用程序。
Zephyr内核支持多种体系结构,包括ARM Cortex-M, Intel x86, ARC, NIOS II, Tensilica Xtensa and RISC-V 32.。官网上列出支持的Boards非常多。
为什么要学Zephyr
首先打击一下Zephyr, 一些朋友不大看好Zephyr的原因很多,最主要的原因大概如下:
(1)开发习惯和传统的嵌入式MCU开发差别太大(但和嵌入式Linux的开发哲学很接近)。
(2)Zephyr生态的学习成本比较高,一下子想到的就有python, sh, git, west, CMake,make, qemu, posix,这些在采用KEIL/IAR这些集成开发环境来管理和迭代整个MCU项目时,根本不需要学。
(3)就是官网上列出支持的Boards虽然非常多,但是,这些板中,相当部份的板级支持离拿来应用于生产环境还需要开发者根据模板完善板级驱动才行,由于Zephyr的体系结构移植和板级驱动目前还不如在KEIL和IAR下来得方便,这也是很多人不看好Zephyr生态的原因。
(4)Zephyr生态目前还没有支持广泛使用的Keil, IAR等商用IDE.
针对上面的三点,我暂时的总结是:
(1)传统的MCU开发用传统MCU开发模型很好,但是如果是针对IOT场景,Zephyr生态沿自Linux的开发模型很可能是一个很好的选择,因为Linux的开发模型是专业的程序员经过很多年总结出来的应对大碎片化、大复杂度和大项目构建的开发模型。借用Unix哲学中的原则就是:避免手工hack,尽量编写程序去生成程序。专业领域,需要的是对专业开发者友好的工具,而不是普通人友好。
(2)其实这是一个自我革命与否的选择,Zephyr生态就是一种针对IOT嵌入式软件开发的新的最佳实践中的一种实践。由于现在IOT推动市场需求变得越来越多样化和复杂,要求MCU项目可以快速持续迭代,可以应对N种无线协议(Zigbee,BLE,Thread,etc)、可以对接N种云(MQTT,COAP,HTTP,etc),还要有方便集成开源组件到MCU项目中的能力。这些要求,用传统的基于IDE图形界面打钩钩的方式,灵活性太低;而现代的开发思想(比如:脚本化、自动化、版本控制、测试驱动、敏捷快速迭代)才是我们MCU开发者必须要进化的方向。
(3)Zephyr正在急速迭代中,一但Zephyr的完成度达到一个很好的折中临界点(第一个LTS已释放出来了),zephyr将会起飞。并且由于zephyr的开发方式和linux的开发方式很相似,将会吸引一大批真正专业的开发者进入到IoT领域中来。当正反馈开始,板级BSP的移植将会变很容易,因为到时有很多大牛的移植可以参考,借鉴。
(4)现在可以用CMake生成支持Eclipse MCU的工程,我试了下,还不错,至于Keil and IAR,其实Zephyr Project已在积极推进中,但还未释放出来而已。
一句话,适用于IOT的RTOS,不止Zephyr,传统的FreeRTOS, RT-Thread, 面向IoT的AliOS Things, mbed-os, AWorks等等也是很好的选择,当然,当前在生产上使用Zephyr不是一个好的实践,但是学习下Zephyr的先进理念,绝对会有一个好收获。
怎样学Zephyr
Zephyr从最初的只支持linux下开发,到现在同时支持Windows下进行开发,说明了Zephyr想吸引尽可能多的开发者加入Zephyr中来。但如果想要真正高效地使用Zephyr这个生态,个人感觉还是在ubuntu是最佳的选择。因为Zephyr是由linux基金会管理的,Zephyr的基因来自Linux进化了多年的最佳实践。
社区驱动的Zephyr生态有优点,也有缺点,一个很大的缺点就是不象在商用开发环境下那样“易用”,Zephyr没有向开发者隐藏太多的细节,初学者开始学时会非常兴奋,照着文档中的Getting Started Guide ,执行下面的两行命令,就运行了一个简单的hello world.
west build -b qemu_x86 samples/hello_worldwest build -t run
开始得确很有成就感,但当想在实际的项目上使用Zephyr时,却感觉不知如何下手开始,更多的,比如我,开始时也一下子摸不着从那入手学习Zephyr比较好。
我现在的心得如下:
(1)学习Zephyr前,要大概入门一下Python, Qemu, CMake, Git, Ninja, West(是Zephyr的meta-tool, 简化了Git管理、构建和调试,要掌握)。
(2)好的IDE能使学习事半功倍,当前主流的Zephyr的开发环境是用visual studio code或者eclipse来搭建,我使用eclipse来搭建,只是个人习惯,不过,CMake支持把Zephyr项目构建为支持Eclipse的Prj。如下图所示,是我用eclipse mcu作为Zephyr的具体项目的集成IDE。
(3)个人感觉不要一上来就从源码入手来学,因为Zephyr 1.14 Release已释放,已有一个比较长期的稳定的API,我们可以先从API这层抽象入手,然后再在理解API为目的的前提下去看源码,然后就到熟练使用IDE来调试代码,再下来就是掌握zephyr的驱动开发和如何裁剪内核模块和组件。
上面的总结只代表本人当前的心得,希望对你和将来的我(心得也是要不断迭代的)都有所帮助。