HAL、BSP、驱动程序

nad*_*eoh 2 hal driver bsp

一些背景:我正在研究具有微控制器目标的嵌入式系统。我在这里的目的是澄清可用于代码存储库名称的术语。我专注于该文章中的低级命名,它对我来说代表面向目标的代码(而不是面向应用程序的高级代码)。

我在网络和论坛上循环,似乎没有人明确定义这些术语之间的区别:HAL、BSP 与驱动程序。

根据我的说法,我的所有三个术语在理论上都是等效的,但人们似乎会区分 HAL 是为 MCU 驱动程序(例如 UART、GPIO 等)保留的,而 BSP 是为外部外设驱动程序(例如加速度计)保留的、EEPROM、...)。

有人可以帮我澄清一下吗?此外,您能否提及您的答案是基于您的个人意见,还是基于社区/公司/标准/其他内容的推理/基本原理?

感谢您的时间,

小智 5

我将根据我使用 MCU 的经验提供答案,但我也认为它可以更好地标准化并在嵌入式软件社区或组织内参考。当谈论更复杂的计算系统(CPU 和更高级别的操作系统)上的较低级别交互时,这些术语似乎确实有更标准和实用的定义。

考虑低级嵌入式系统架构,在低级编写嵌入式软件是构建可在许多项目中使用的可重用基础与考虑该硬件级别的内存、功耗和关键时序之间的平衡,这可能需要针对不同的用例进行调整。

在嵌入式和电子系统中,我将每个系统定义如下:

哈尔

硬件抽象层 - 该层提供了写入 MCU 内的硬件寄存器(例如 ADC、定时器、UART 等)的抽象 - 我在这里将其称为“设备”。这里的函数提供对硬件功能的访问,并构建在特定于设备的头文件/链接器文件上。

HAL 固件应该是特定于设备的(尽管实际的 C 代码可能支持 MCU 系列中的多个设备,并且预编译器定义可用于启用、禁用或在不同设备的功能之间切换)。

许多常见的 MCU 供应商(例如,带有 DriverLib 的 TI、带有 STM32Cube 的 ST)为其许多 MCU 提供 HAL 库,这些库通常适用于大多数应用,但由于是通用的,因此在功耗、内存和性能方面可能不那么高效。与直接控制设备内的每个寄存器相比,特定于您的应用程序的时序。

如果您有一个项目并且更改了 MCU,那么理想情况下您想要更改的只是 HAL 固件。

中央银行

板支持包 - 这可以用作 HAL 之上的层,指的是器件如何连接到板上(例如引脚 2 上的 LED)。应用程序/组件层将调用 BSP 层来打开 LED,然后 BSP 层将调用 HAL 来切换设备硬件中的 GPIO。

如果我要向我的项目添加一个新的 LED,我不需要更改 HAL 固件,只需更改使用这个新 LED 的 BSP 和应用程序组件。

司机

这应该指用于控制外部硬件的任何固件组件(例如,加速计、外部 EEPROM 等)。这是一个带有 API 的独立组件,可供您的 BSP(或者可能是您的应用程序层)使用。

例如,任何使用特定加速计的项目都应该能够使用该加速计的驱动程序固件,无论设备或电路板布局如何。

例子

例如,考虑一个跟踪加速度数据并将每个轴的前 100 个值存储在外部 EEPROM IC 中的项目(我说 EEPROM 是因为问题使用它作为示例,EEPROM 可能不是现实中的最佳选择)。然后分析该数据,LED 根据加速度大小的滚动平均值以不同的速率闪烁。使用 HAL、BSP 和驱动程序的示例架构如下(请注意,这是出于演示目的而非常粗略且快速地设计的,因此可能不是完美的设计):

嵌入式应用示例

一些有用的链接:

https://github.com/ARMmbed/mbed-os

https://www.ti.com/lit/wp/swsy004e/swsy004e.pdf

我希望这有帮助。

我也想听听其他嵌入式开发人员对这些定义的想法。