2017年7月3日, Drew Moseley嵌入式和物联网(IoT)空间中的软件开发人员在选择操作系统(OS)来支持其设计时面临众多令人眼花options乱的选择。有关硬件和工具的决策显然将对项目的成功产生重大影响。假设您可以灵活地选择最适合您的设计的组件,并且不受历史决定或向后兼容性的限制,那么您有必要投资前期研究以了解选项并为您的项目做出最佳选择和设计团队。
当您的系统重点主要是具有简单控制逻辑的机电时,Linux设计可能会显得过时,而使用RTOS或控制循环可能更合适。当系统的重点更多地放在数据处理和网络上时,在您的设计中考虑使用Linux可能是有意义的。如果您的系统兼有这两种元素,那么您可以肯定会在Linux中实现机电方面的功能,因为与大多数其他系统相比,Linux内核可以为更广泛的外围设备提供设备支持。更复杂的系统可能需要使用多核芯片组或多个芯片上的异步多处理功能来建立双OS。
在您的设计中使用Linux的一个令人信服的原因是它的普遍性。书籍,视频和其他培训材料很容易获得,而找到描述与您的设计相似的用例的博客或会议演示文稿仅需进行网络搜索。诸如stackoverflow.com和quora.com之类的资源中充满了有趣,及时的信息,可以在您的教育和设计周期中提供帮助。此外,还提供了edx.org,coursera.org和udacity.com等供应商的在线课程(许多免费),涵盖了与Linux相关的各种主题。
在Linux系统上运行的可用软件数量惊人。对于依赖于外部定义的协议,API等的设计的任何部分,您都可能会找到在Linux上运行的实现。对于许多此类软件组件,您将找到一个充满活力的开发人员社区,其中提供了错误修复,支持和功能开发。通常,将这些位集成到Linux设计中很简单,但是会根据您选择的发行版或构建系统而有所不同。幸运的是,通用的分发和构建系统还具有活跃的社区,可以为默认情况下未集成的项目提供帮助。
也不乏具有Linux专业知识的有才华的开发人员。由于行业广泛采用基于Linux的设计,因此寻找具有相关经验的工程师相对容易。从招聘团队的角度来看,找到已经接受过所需技术培训的工程师是一个明显的优势。从工程师的角度来看,开发您认为有趣的技术并能够将您的专业知识应用于多个潜在雇主是一个很大的好处。简而言之,Linux和相关技术极大地简化了与人才匹配的招聘需求。
您可以使用各种各样的发行和构建系统来开发嵌入式Linux系统。可以缩减许多桌面发行版,以在有限的资源环境中使用,并且像Ubuntu这样的系统具有专门针对IoT设备的品种。Raspberry Pi平台使用定制的Debian映像作为其主要目标OS映像。此外,还有多种选择可以交叉编译完整的Linux系统。Yocto,OpenWRT和Buildroot是最常见的三个。这些系统通常托管在标准桌面Linux发行版上,并将为您选择的目标设备交叉构建Linux系统。所需的更改将首先内置到Linux桌面上的目标映像中,然后从那里部署到目标安装介质。
在下面的讨论中,我们将更详细地描述Yocto项目,并解释为什么我们认为它是用于IoT的嵌入式Linux设计的好选择。
嵌入式注意事项
嵌入式Linux的开发模糊了嵌入式和桌面开发之间的界线,可以提供这两种模型中的佼佼者。许多嵌入式Linux系统承载SSH服务器,GUI和目标工具等功能,从而允许类似于传统桌面开发的开发工作流程。可以在部署的系统中直接修改用脚本语言编写的代码,并测试更改,而无需花费昂贵的构建/部署周期。对于已编译的代码,许多此类系统的计算能力受到限制,并且按目标构建可能会非常缓慢。使用交叉编译环境执行此类任务的速度明显更快,并且感觉更像传统的嵌入式开发,为开发人员提供了开发主机OS上可用的所有工具和功能。
众所周知,设置交叉编译环境很棘手。正确组合工具链组件和库可能会让人沮丧。将内核标头与桌面分发内核和嵌入式内核都匹配可能是一个挑战。获取预构建的跨工具链有多种选择。如果幸运的话,桌面开发系统上的程序包管理器可能提供了一种。如果发行商提供的软件包对您不起作用,则可能需要使用诸如crosstool-NG之类的构建系统。
开发人员与嵌入式目标板的连接通常是通过串行端口和以太网。幸运的是,嵌入式Linux对这些设备有广泛的支持,通常不会对您的设计团队造成任何障碍。Windows和MacOS主机系统中的驱动程序支持可能会出现问题,因为这些设备驱动程序可能未包含在默认操作系统中,并且可能需要安装第三方驱动程序。
对JTAG的支持在嵌入式Linux中有些分散,对低级内核调试非常有用。此外,它高度依赖半导体制造商以及JTAG设备制造商的供应商支持。通常,使用广泛使用和移植的工具(例如GDB)可以更好地完成应用程序和用户空间代码的调试。
嵌入式和物联网领域的项目使用各种各样的芯片架构和电路板。Linux内核已移植到绝大多数市售部件上,并且很可能已经支持您选择的芯片组。大多数半导体供应商直接开发内核代码和驱动程序来支持其产品,从而使在设计中轻松采用Linux成为可能。但是,并不是所有供应商的贡献都可以从kernel.org的库存内核中获得,因此您可能需要进行一些研究和集成工作,以收集所选平台所需的所有软件组件。
Yocto计划说明
的Yocto计划将自己定义为“一个开源协作项目您创建无论硬件架构的嵌入式产品定制的基于Linux的系统提供的模板,工具和方法来帮助。” 它大致类似于桌面Linux发行版的概念;但是,这有点过分简化了。Yocto更恰当地称为元分布。它是配方,配置值和依赖项的集合,用于创建根据您的特定需求量身定制的定制Linux运行时映像。
Yocto项目着重于机制,使开发人员可以自由地根据您的设计强加政策。在桌面发行版将选择诸如打包格式和初始化 系统之类的选项的地方,Yocto提供了配置点,使您可以根据需要选择这些配置点。默认情况下,用户可以选择deb,rpm,ipk或tar 软件包格式;或通过添加自定义bbclass 文件轻松添加一个新文件。同样,选择sysvinit 或system init系统是对本地构建文件的简单配置更改。
Yocto构建开始于构建构建系统本身所需的许多本机实用程序。这样做是为了最大程度地减少对主机OS的依赖性,并确保有一组已知的软件包版本。然后,大多数配置将继续构建经过测试且已知的良好交叉编译环境,然后再继续构建目标平台的二进制文件。由于为Yocto配置构建了许多软件包,因此这会在主机系统上消耗大量资源和时间。
程序包定义包括各个阶段(例如,获取,编译,安装,打包),并且必须指定任何运行时或构建时依赖项。该构建由一个称为bitbake的执行程序控制,该执行程序负责处理依赖关系和安排任务。任务将在主机系统资源和任务之间的相互依赖关系允许的范围内并行执行。此外,使用共享状态机制维护每个构建阶段的中间输出,以允许在相似的构建中重复使用,这可以显着提高速度。
Yocto的优点:功能
Yocto注重于机制而非策略,这为系统开发人员提供了更大的自由度。这种方法可确保您可以根据设计需求自由设置策略,而不必适应系统软件提供商执行的决策。Yocto提供了明智的默认设置,以允许开发人员快速入门,但是更改这些策略的机制已被详细记录且易于采用。
该Yocto层基础设施是Yocto模型的一个组成部分。层将与功能相关的功能分为不同的捆绑包,仅可根据需要将其添加到构建设置中。这大大降低了每个单独层的复杂性,并使它们可以按照自己的进度进行开发。图层按优先级顺序包含在构建中,从而允许较高优先级的图层覆盖和修改基础图层中的设置。
平台层通常支持向Yocto添加板;它们通常将包含自定义内核和引导加载程序组件,以及任何特定于板的运行时软件包和配置。下表显示了许多半导体行业重量级人物提供的平台层。这些层为广泛的市场上可买到的芯片和电路板提供了支持,应该用作包含这些部件中任何一个的任何设计的起点。
https://layers.openembedded.org/layerindex/branch/master/layer/meta-qcom/
https://layers.openembedded.org/layerindex/branch/master/layer/meta-ti/
https://layers.openembedded.org/layerindex/branch/master/layer/meta-freescale/
https://layers.openembedded.org/layerindex/branch/master/layer/meta-amd/
特征层添加的功能通常对所有Yocto用户而言并不有价值,但是被认为过于复杂而无法包含在基础层中。以下列表显示了当今可用的某些要素图层。https://layers.openembedded.org/layerindex/branch/master/layer/meta-mender-core/
https://layers.openembedded.org/layerindex/branch/master/layer/meta-qt5/
https://layers.openembedded.org/layerindex/branch/master/layer/meta-nodejs/
https://layers.openembedded.org/layerindex/branch/master/layer/meta-snappy/
在传统的桌面Linux分发模型中,通常是从CD或USB密钥安装,然后在正在运行的目标系统中执行其他软件包安装和配置。Yocto工作流程有所不同;它包括在开发机器上运行完整版本,其输出是包含整个目标系统的映像。稍加注意,您就可以消除运行目标中所需的大多数(如果不是全部)配置步骤,从而可以更可预测地加载软件并减少测试矩阵中的维数。Yocto甚至可以将运行时软件配置为使用只读的根文件系统,从而使系统始终从已知良好的状态启动。当然,这需要您自己确保状态正确保存到持久数据存储中。
此外,Yocto项目遵循严格的发布时间表。这种可预测性对于基于Yocto的项目至关重要,并允许开发团队计划其活动。开发人员可以根据自己的需要选择活动的基础Yocto分支。开发分支将确保访问最新功能,而稳定分支将减少更改的速度,同时仍允许进行更新以解决CVE(常见漏洞和披露)问题和其他潜在的安全隐患。
Yocto的优势:行业和社区的支持
Yocto Project网站对Yocto周围的生态系统有以下说法:
“对于开源项目,没有什么比它周围的个人和组织的生态系统重要。”
这很容易是Yocto的主要优势之一。不能充分强调社区的价值;支持论坛和专业知识随时可用,活跃的开发社区也在推动Yocto向前发展。作为一个开源项目,您可以根据自己的需要对其进行修改,或者找人为您完成;无需担心软件供应商会改变策略并让您重新开始。
Yocto在行业中也被广泛采用。除半导体供应商外,还有许多供应商提供商业支持的Yocto软件和服务。Yocto项目参与者页面显示了使用Yocto的各种行业参与者。此外,诸如GENIVI Alliance和Automotive Grade Linux之类的行业计划还有助于将Yocto推向汽车行业。
Yocto的优势:工具和SDK
如上所述,获得适当支持的跨工具链可能需要大量的精力。Yocto项目包括在项目构建过程中构建功能齐全的工具链的配方。Yocto社区已经在各种体系结构和平台上对该工具链进行了测试,在大多数情况下,该工具链足以支持您的项目。如果需要,可以使用标准Yocto配方机制轻松定制此工具链。此外,如果您的目标芯片支持默认工具链中未启用的功能(例如,自定义指令或优化),则在平台层中只需添加特定于平台的调整参数即可。最后,如果您需要使用第三方提供的预构建工具链,则Yocto内置了一些机制来允许这种情况。
Yocto还可以将平台所需的工具和库捆绑到可交付给应用程序开发人员的SDK中。这比要求此类开发人员运行完整的Yocto系统构建要简单,并允许优化的应用程序开发工作流程,同时确保这些开发人员具有工作所需的所有组件的正确版本。
Yocto的缺点Yocto的
学习曲线相当陡峭。仅术语本身就令人生畏(例如,Yocto,Poky和OpenEmbedded之间有什么区别?)。用于配置目标的选项数量众多,因此难以评估最佳选择。通过遵循简单的Web搜索中可用的任何教程,可以快速实现基本系统的启动和运行。但是,了解需要对您的特定设计进行哪些更改可能需要大量的研究和调查。可以肯定的是,存在复杂性的正当理由,我们认为上面讨论的优点值得付出努力。一旦完成了初始准备工作,进一步的设计工作将更快地进行。
对于习惯了传统台式机和服务器软件开发的开发人员,Yocto工作流程可能会造成混乱。在桌面开发环境中,主机OS提供程序通常提供一种安装新软件包的机制。例如,在Ubuntu中,可以使用apt-get 命令轻松安装新软件包。可通过可通过Internet连接访问的服务器中的预编译二进制文件中提供的软件包。在Yocto中,您将需要修改配置并重建以添加其他软件包。通常没有互联网托管的软件包库可供提取。
在跨构建环境中工作可能会感到陌生,并且要求开发人员同时了解主机和目标系统。能够在目标系统中开发代码,进行编译(或仅在脚本环境中运行)和快速测试,比运行bitbake 构建并将新映像部署到目标中要快。需要明确的是,Yocto确实支持目标开发工具来支持这种工作流程。但是,一旦开发并调试了所需的代码,则还需要执行其他步骤才能将这些更改重新集成到Yocto构建环境中。一种中间方法是在Yocto环境中进行更改,然后仅部署更新的软件包。Yocto构建系统以标准格式(rpm,deb,ipk或tar),可以使用目标上的实用程序(例如rpm 或ipk)将其安装到正在运行的系统中。这些方法可以很好地在生命周期的早期优化开发周期。但是,随着产品发布的临近,您通常希望最小化或消除测试映像和生产映像之间的差异-在正在运行的系统上手动安装软件包或修改代码可以有效地创建自定义映像。
最后,完整的Yocto构建的构建时间可能很长。通常,由于需要为功能齐全的Linux系统构建大量软件包,因此这是不可避免的。但是,可以通过Yocto共享状态机制大大减轻这种情况。
物联网特定需求
Yocto项目是物联网项目的绝佳选择。以上讨论的所有优势对于物联网领域的设计都是有效的。肖恩·哈德森指出:
我们向客户推荐Yocto项目,它是我们自己的Mentor嵌入式Linux(MEL)的基础,因为它具有灵活性,广泛的行业支持,庞大的社区以及对长期维护的支持。对于物联网(IoT),支持多种架构,多种设备配置以及目标软件组合的需求使其非常适合为IoT设备创建Linux基础。Sean Hudson ,西门子商业Yocto项目顾问委员会
技术人员和嵌入式Linux架构师
导师
创始成员
现任OpenEmbedded董事会成员
维基百科将物联网定义为:
物理设备,车辆(也称为“连接的设备”和“智能设备”),建筑物以及其他嵌入了电子,软件,传感器,执行器和网络连接的物品的互连网络,使这些对象可以收集和交换数据。
从广义上讲,有两种类型的IoT设备:托管传感器或执行器的小型系统,以及IoT网关,网络连接存储(NAS)盒,家庭自动化路由器等大型系统。它们中的许多运行不能轻松支持Linux的8位或16位微控制器。对于较大的设备,通常是Linux,尤其是Yocto是一个很好的选择。这些类型的设备越来越多地使用易于获得的消费类硬件设备(例如Raspberry Pi或BeagleBone)进行原型设计(有时是实现)。Yocto项目为这些(以及许多其他类似)板提供了出色的支持,并且是快速开始您的IoT项目的绝佳方法。
许多连接的设备作为大量设备进行部署和管理。在这些情况下,上述软件内容的可预测性是一个主要优势。手动更新设备会占用大量资源,并且容易出错,拥有设备及其软件内容的确定清单是确保车队安全的第一步。如果已部署的设备可以对其软件进行重大修改,则可能很难确定要进行哪些更新。
物联网系统倾向于使用台式机Linux发行版中不一定广泛使用的软件,库和协议。可以使用标准Yocto层将许多常见的软件包(例如MQTT和AMQP)轻松添加到您的Yocto构建中:
MQTT: http : //cgit.openembedded.org/meta-openembedded/tree/meta-python/recipes-devtools/python/python-paho-mqtt_1.2.bb
AMQP: http : //cgit.openembedded.org/meta-openembedded/tree/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.7.0.bb
此外,Yocto使用功能层直接支持诸如IoTivity之类的行业计划:
https://layers.openembedded.org/layerindex/branch/master/layer/meta-oic/
结束语
对于Linux发行版和构建系统,开发人员有多种不错的选择。Yocto项目是大多数嵌入式项目的可靠选择,并且是一个很好的起点。本文概述的Yocto构建系统的好处是其在嵌入式软件行业中得到如此广泛使用的原因之一。物联网领域的产品开发正以惊人的速度进行,其中许多设备的功能集都受益于Linux实施。Yocto的各种功能,可扩展性和对目标图像内容的细粒度控制使其非常适合这些空间中的项目,并且在您开始设计时当然值得进行一些研究。
Drew Moseley 当前是Mender.io开源项目的一部分,该项目旨在将OTA软件更新部署到嵌入式Linux设备上。他在佛罗里达州坦帕长大,并就读于佛罗里达大学。Drew在英特尔,摩托罗拉,红帽,Monta Vista,Mentor Graphics以及最近的Mender.io从事嵌入式软件和开发工具方面的职业生涯。在过去的10年中,他从事嵌入式Linux的工作,而在过去的6年中,他专注于Yocto。德鲁(Drew)是退休的击剑运动员,击剑教练和裁判。在业余时间,他喜欢从事电子项目,最大限度地减少生活,并在佛罗里达的阳光下度过。