嵌入式开发:设计HAL的10个技巧

更新时间: 2022-09-24 09:13:17来源: 粤嵌教育浏览量:7843

  设计HAL是开发可重用且独立于硬件的固件的重要第一步。HAL或硬件抽象层为嵌入式开发人员提供了一组标准函数,可用于访问硬件功能,而无需详细了解硬件的工作原理。

  Hal本质上是设计用于与硬件交互的API。一个正确设计的HAL为开发者提供了许多好处,比如代码是可移植的、可重用的、低成本的、抽象的、以及更少的错误。然而,一个设计糟糕的HAL会导致成本增加和软件错误。为确保正确,开发人员在设计自己的HAL时可以遵循以下10条技巧。

  技巧1——识别核心特征

  HAL需要是一组一致的标准函数,可以跨多个硬件平台使用。微控制器带有一套标准的外设,所有这些外设在嵌入式系统中都有特定的用途。开发HAL时,检查每个标准微控制器外设,并确定其核心特性。例如,通信设备需要的一些核心功能是初始化、发送和接收功能。这些是几乎任何应用程序都需要的基本必备功能。

  技巧2——避免无所不包的HAL

  嵌入式开发工程师有时会陷入“一环统一”的陷阱。陷阱在于,工程师从简单而优雅的东西开始,然后发展解决方案以覆盖项目流程。HAL设计者应该避免试图创建一个包罗万象或单一的HAL来控制每个微控制器设备和外设。避免使用包罗万象的 HAL 的原因是,如果你试图创建一个HAL,那么复杂性、成本和潜在的错误将会急剧增加。每个微控制器都有独特的功能,所以不可能为它们创建一个标准而优雅的HAL。

  开发者能做些什么来处理HAL不能处理的外围特性呢?答案是在HAL中内置寄存器访问功能。HAL可能会暴露这样一个事实,即它不能涵盖外设的每一种可能的用途和状态,而是提供对驱动程序内的选择寄存器的读写访问。寄存器访问功能被认为是“专家”模式HAL功能,只应由熟悉微控制器内部工作原理的开发人员使用。

  技巧4——使用Doxygen勾勒HAL

  为HAL计划和开发文档的一个好方法是使用Doxygen。使用Doxygen来规划HAL有许多优点。首先,Doxygen使用代码注释来生成HTML、RTF和PDF文档,这意味着嵌入式开发人员已经有了关于不同函数应该做什么的源代码注释。第二,由于HAL的注释是自动开发的,HAL源文件成为一个空白模板,开发者可以根据软件体系结构和需求从该模板中填充HAL功能。最后,随着时间的推移,对HAL的任何更新都可以在一个地方进行,即Doxygen文件,然后这些更新很容易传播到文档中。

  

  技巧5——第二次观察

  重新审视 HAL 是获得全新视角的绝佳方式。事实上,在任何开发周期中,最好的事情之一就是让多方关注设计。每个工程师都有自己的观点和经验,可以为 HAL 做出贡献。来自多方的反馈,尤其是那些可能必须使用HAL的人,是一个很好的方法,可以最大限度地减少需要对 HAL 进行多少更改,并有助于确保HAL将长期存在,以最大限度地提高代码重用率并最大限度地降低成本。

  技巧6——不要害怕重复

  在HAL的首次发布中,会有一些在HAL的设计和评审中被忽略的小问题和发现。别担心!设计一个完美的HAL是不现实的,目标应该是开发一个好到可以开始使用的HAL。收集HAL用户的反馈,然后进行小的迭代更新。确保这些更改被很好地记录下来,以便遗留的HAL用户可以很容易地更新到最新的版本。经过几次迭代之后,嵌入式开发人员会发现他们的HAL已经变成了一台运转良好的机器,节省了宝贵的开发时间。

  技巧7——保持30000英尺的视野

  请记住,HAL的目的之一是提供一个标准且一致的接口来抽象硬件功能。保持界面简单,并保持硬件在 30,000 英尺视图下工作的详细程度。一个很好的测试是让一个经理或一个软件新手审查 HAL 并确保他们能够理解它是如何工作的。

  将HAL保持在一个高的抽象层次不仅有助于最大化它的用途,还可以消除误解,这些误解会导致长时间的调试会话、增加成本或错过最后期限。还要记住,HAL应该留有足够的余地,让嵌入式开发人员能够以适合他们的需求和应用程序需要的方式实现HAL功能。API或HAL应该允许实现和支持不同的底层实现策略。

  技巧8——使用适当的命名约定

  开发HAL时,一个安全的做法是使用符合ANSI-C的接口。符合ANSI-C的HAL将确保跨多个编译器和工具链的可移植性。ANSI-C兼容要求的一个例子是将函数名长度限制为31个有效字符。其他的考虑是使用标准的可移植类型和避免编译器内部函数。另一个小技巧是定义一个简短的编码标准,包括命名和编码标准最佳实践,以及如何编写HAL接口。

  技巧9——包含一个初始化参数

  嵌入式开发人员设计HAL时最常见的错误之一是让外设初始化函数不带参数。本质上,每个应用程序的初始化都是硬编码的。无参数初始化极大地限制了HAL的可移植性。向配置表传递一个指针会更好地服务于初始化函数。最简单的实现就是一个空的void表。一种更复杂的实现方式是使用指针遍历表并配置外设。无论哪种方式,传递指针都为HAL提供了更好的可移植性和重用性。

  技巧10——在多个开发套件上部署

  测试HAL的一个简单而有效的方法是将其部署在来自不同芯片供应商的多个微控制器上。开发简单的测试代码将有助于摆脱HAL,并预先阐明任何可移植性问题。开发套件是一个很好的方法,可以很便宜地获得硬件来测试HAL。

  结论

  在嵌入式软件领域使用HAL有很多好处。主要的好处是拥有一组定义明确的函数,允许应用代码轻松地从微控制器移植到微控制器。其他好处包括重用、降低成本和硬件抽象化。一些嵌入式开发人员可能会认为HAL会降低执行效率并增加代码空间。现代微控制器和编译器的架构和优化能力几乎已经解决了这些问题。

免费预约试听课