微控制器已经达到了一个成本点和功能点,许多应用程序的开发人员不再需要编写严格的裸机代码。相反,开发人员可以编写更高级别的代码,类似于PC上的应用程序开发人员编写代码的方式。为了做到这一点,有两种不同的机制可供嵌入式开发人员使用:API和HAL。
HAL是一个硬件抽象层,它定义了一组用于与硬件交互的例程、协议和工具。HAL专注于创建抽象的高级功能,这些功能可用于使硬件做一些事情,而不必详细了解硬件是如何做的。对于使用多个微控制器硬件并需要将应用程序从一个平台移植到另一个平台的开发人员来说,这非常方便。HAL也是一种很好的方式,让不是底层硬件专家的工程师也能编写有用的应用程序代码,而不需要具体的细节。
API是一个应用程序编程接口,它定义了一组用于创建应用程序的例程、协议和工具。API定义了组件及其输入和输出的行为和功能的高级接口。应该创建一个通用的、独立于实现的API。这允许API在多个应用程序中使用,只需改变API的实现,而不需要嵌入式开发人员改变一般的接口或行为。
API和HALs密切相关,但在软件开发中有两种不同的功能。HAL位于底层驱动程序之间,为通用软件堆栈(如RTOS)和中间件组件(如USB、以太网和文件系统)提供通用接口。HAL可以充当包装器,用于在现有驱动程序和高级代码之间提供公共接口,或者它可以作为驱动程序接口本身存在。API就像一个工具包,帮助高级开发人员快速生成应用程序代码。它为控制系统的实时行为和访问通用组件(如串行通信和文件访问)提供了通用接口代码。
分离这两个概念并使用分层软件架构可以极大地提高嵌入式软件的可重用性。想象一下,能够交换HAL下的每一层,并用新的硬件和驱动程序替换它。这是升级现有硬件时可能发生的情况的一个很好的例子。不需要从头开始,只需要更新HAL下面的代码。同样的想法也适用于删除HAL之上的代码。相同的硬件,新的应用程序。其结果是,更快的嵌入式开发周期、增加的代码重用和由于继承而增加的健壮性。