今天在水群的时候听见群友在骂HAL库。
其实这些年来也听了不少骂HAL库的声音,说HAL库垃圾、HAL库层层封装影响效率、HAL库逻辑很差等等。
但是HAL库真的如他们说的一样嘛?
- 标准库
STM32标准库是针对STMicroelectronics公司生产的STM32系列微控制器的一套软件开发工具,用于简化嵌入式系统开发过程中的常见任务。这个标准库提供了一系列的函数和驱动程序,用于配置和操作STM32微控制器的各种外设,比如GPIO、UART、SPI、I2C等等。
事实上STM32开发从机械码->汇编->寄存器->标准库,本质上并没有太大的区别,只是开发的时间不一样,为了机械码的方便记忆引入了汇编语言,将汇编语言链接到C语言开发直接操作寄存器,将
寄存器操作封装成函数形成了标准库 。 标准库是一种更接近于底层。
它允许开发者根据需求自由控制硬件,提供了更多的控制选项,但相应地要求开发者具备较高的硬件知识,并且学习过裸机开发的同学毫无疑问的被各种初始化代码所折磨,使得开发的时间成本异常的高,相当的啰嗦和麻烦。
- ** HAL库 **
HAL(Hardware Abstraction
Layer,硬件抽象层)库是STMicroelectronics开发的一套软件库,旨在为STM32系列微控制器提供一个高度可移植、可重用的硬件抽象接口。HAL库的设计目标是简化嵌入式系统的开发,使开发人员能够更容易地编写跨平台的代码,从而提高开发效率。
HAL库的本质是通过 提供一套统一的软件接口
,将底层硬件功能进行抽象,使得开发者可以更加方便地使用硬件功能,从而加快嵌入式系统的开发速度,并提高代码的可维护性和可移植性。
由于这个特性,HAL库非常适合于不同设备(不同型号芯片)之间的 代码移植
工作,只需要替换掉特定的外设驱动源文件,即可实现代码移植。并且CubeMX支持HAL库和LL库的。而标准库的代码移植工作会非常繁琐,因为每个系列的寄存器地址和功能都不一样,所以想要在标准库的基础上移植程序是非常复杂啰嗦的一件事情。
因此在开发中引入HAL库来编程是一件非常 ** 节省时间成本 ** 的事情。
- HAL库的缺点
HAL库同样的也有他的缺点,由于引入了更高级的抽象函数来实现代码层面的统一,一定会造成 ** 额外的性能开销需要额外的函数调用来实现功能 **
,因此在对性能要求极高的场合可能更适合于标准库的开发。
HAL库提供了较高级别的抽象,脱离了硬件层面,所以可能会导致很多的初学者无法理解HAL库,造成HAL库的学习困难。
其次是由于HAL库层层封装的原因,当特定场合下我们需要访问寄存器的时候,HAL库无法灵活的访问底层寄存器。
- ** 总结 **
但是使用HAL库或者LL库已经是时代的趋势了,CubeMX中也不支持标准库代码的生成。并且官方也已经停止了标准库的更新,
比较新的F7和H7甚至都放弃了对于标准库的支持。
互联网上许多关于STM32开发的教程都是比较老的标准库教程,导致很多的小白学习的时候都是从标准库入手的。
事实上并没有那个库是绝对的好,也没有那个库是绝对的差,选择适合于自己的编程方式,拒绝抗拒接受新事物,思维的固化所带来的影响才是最最可怕的。