开发可重用固件–API实用指南’s, HAL’s and Drivers

开发可重复使用的固件是一项重要且至关重要的技能。我与之互动的大多数工程师和团队都被困在不断重复的工作中,以重塑他们正在进行的每个项目。为了帮助开发人员了解他们如何不仅可以创建可重用的应用程序代码,还可以创建可重用的固件,直到驱动程序本身,我写了一本书“开发可重用固件–API的实用方法’s, HAL’s and Drivers”。几年后,这本书现在正式准备好了!可以在下面找到摘录,也可以阅读包含目录的整个第一章 这里.

为什么代码重用很重要

在过去的几十年中,嵌入式系统的复杂度不断提高。互联网的诞生只是加速了这一进程,因为我们的社会一直在争相连接几乎所有可以想象的设备。曾经简单而独立的系统现在必须以安全和故障安全的方式通过Internet连接,以便将关键信息流式传输到云中。随着每一代设备的推出,复杂性和功能都以指数级的速度增长,迫使工程师重新评估如何在分配的时间范围和预算内成功开发嵌入式软件。

对产品功能不断增长的需求以及将系统连接到Internet的需求,极大地增加了为发布产品而需要开发的软件数量。如图1所示,尽管软件的复杂性和功能一直在增加,但是可用于开发产品的时间大部分保持不变,而开发时间的增加可以忽略不计(5年内增加2周)。在时间表上,开发人员被迫购买可以减少开发时间的商用现货(COTS)软件,或者需要重用以前项目中尽可能多的代码。

传统上,使用功能设计方法(如果已使用任何方法)针对特定应用开发了微控制器固件,该设计方法通常将低级硬件直接绑定到应用代码中,从而使软件难以甚至无法重用和移植。在相同的硬件体系结构上,更不用说在不同的体系结构上重用。开发一次性固件背后的主要驱动因素一直是许多嵌入式产品展示的资源有限的性质。 RAM大于几千字节且闪存大小大于16 kB的微控制器曾经很昂贵,并且不能将其设计为产品而不会破坏任何获利的希望。嵌入式软件开发人员没有足够的内存或强大的处理器来工作,因此无法在应用程序开发中使用现代软件设计技术。

现代微控制器开始改变游戏规则。现在,典型的低端ARM Cortex-M微控制器仅需花费几美元,并提供至少16 kB的RAM和64 kB的闪存。内存成本的急剧下降,更大的内存可用性以及更高效的CPU架构,消除了固件开发人员所苦恼的资源受限性质。结果是开发人员现在可以开始使用设计方法,这些方法将应用程序代码与硬件分离,并从根本上增加了代码重用。

图1 –固件项目平均开发时间(以月为单位)1

便携式固件

今天开发的固件是以相当古老的方式编写的。每个产品开发周期都会导致代码无限制地重复使用,而重塑是开发团队中的主要主题。一个简单的例子是,开发团队拒绝使用可用的实时操作系统(RTOS),而是开发自己的内部调度程序。除了想要构建自己的自定义调度程序之外,还有两个主要的示例来演示重塑的问题。

首先,几乎每个开发团队都编写自己的驱动程序,因为微控制器供应商仅提供示例代码,而不提供可用于生产的驱动程序。示例为理解微控制器外围设备提供了一个很好的起点,但仍然需要大量时间投入才能获得具有生产意图的系统。可能有一百家公司使用完全相同的微控制器,而每个公司将浪费多达30%或更多的开发时间来编写其微控制器驱动程序并将其与中间件集成!我已经在客户群中多次看到这种情况,并且每年听到与我互动的数百名工程师的无数佐证故事。

其次,产品中需要包含许多功能,典型的设计周期为十二个月1,因此开发人员不会花时间来适当地设计其系统以进行重用。高级别的应用程序代码与低级的微控制器代码紧密耦合,这使得分离,重用或移植应用程序代码变得昂贵,费时且容易出错。最终结果是,开发人员每次都从头开始。

为了跟上当今设计周期的快速发展步伐,开发人员需要精于开发便携式固件。便携式固件是嵌入式软件,旨在在多个微控制器或处理器体系结构上运行,而几乎不需要修改。编写可从一种微控制器架构移植到另一种微控制器架构的固件具有许多直接的优势,例如:
•通过不必重新发明轮子来缩短上市时间(这可能很耗时)
•通过利用现有组件和库来降低项目成本
•通过使用经过验证和持续测试的软件来提高产品质量

便携式固件还具有许多团队忽略的间接优势,但其直接优势却远远超过:
•在开发周期中有更多时间专注于产品创新和差异化
•由于限制了需要开发的总代码量而降低了团队压力水平(快乐,轻松的工程师更加创新和高效)
•井井有条的文档,可以使移植和维护更加轻松,并且更具成本效益

如案例研究“智能太阳能电池板的固件开发”中所示,使用可移植且可重复使用的代码可产生非常快速而惊人的结果,但也存在一些缺点。缺点与前期时间和精力有关,例如:
•需要仔细考虑软件架构
•了解微控制器之间潜在的架构差异
•开发回归测试以确保移植成功
•选择实时语言并了解其互操作性或缺乏互操作性
•经验丰富的高技能工程师可以开发便携式和可扩展的体系结构

为了使开发团队成功享受可移植代码使用的好处,需要预先花费额外的时间和金钱。但是,在进行了最初的投资之后,开发周期有了一个开始,与传统的嵌入式软件设计周期相比,有可能将开发时间减少数月。长期收益和成本节省通常会掩盖前期设计成本以及加速开发进度的潜力。

为了重用而开发固件还意味着开发人员可能会被一种编程语言所困扰。如何为可能持续十年或更长时间的软件选择一种语言?最初人们可能会想到,使用一种编程语言并不是嵌入式软件开发中的主要问题。最受欢迎的嵌入式语言ANSI-C于1972年开发,已被证明几乎不可能被篡改。图2显示了可用于所有用途和应用程序的编程语言的流行,其历史可追溯到2002年。尽管计算机科学的发展和面向对象编程语言的发展,C仍然是一种通用语言,并且在嵌入式软件中已深深扎根。

要阅读整个第一章并查看目录, 点击这里.

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.