HAL中的特定于硬件的库

时间:2018-10-04 10:40:12

标签: c++ cmake embedded hal

我正在做一个C ++(带有cmake)嵌入式HAL层,并尝试添加特定于某些MCU的库。现在的问题是从上层访问库函数。

对此,我的解决方案是为特定的板使用cmake文件来定义一个宏,在该宏上库(和函数)将被排除或包含在上层。这需要跟踪宏->库和函数对。

就可伸缩性而言,这并不是一个好方法。从可伸缩性和传统角度来看,是否存在一些更便捷的方法来实现特定于硬件的功能?

2 个答案:

答案 0 :(得分:2)

如果您有一个通用的HAL,其中包括一个仅在某些MCU上可用的库,那么唯一的解决方案是肮脏的条件编译器开关:#ifndef SOMETHING #include "library.h" ...。这些很快使代码不可读,因此始终是不得已的方法。

但是,所有这些确实表明您有程序设计问题。您的程序应按以下方式工作(调用顺序):

应用代码-> HAL-> MCU专用驱动程序

这3层中的每一层都不知道其他内部的任何内容。因此,自然而然地,HAL内不应有任何特定于MCU的东西。相反,它应该在驱动程序内部。即使在极少数情况下,驱动程序中的代码在其他方面都是相同的(例如,使用相同系列的不同MCU衍生产品时)。

因此,在实践中,您最终将得到例如HAL的“ spi_library.h”以及许多驱动程序,例如“ MCUX_SPI.c”,“ MCUY_SPI.c”,其中“ MCUX”和“ MCUY”是不同的MCU零件号。

在C ++中,这通常是通过将HAL作为抽象基类实现的,每个MCU实现都继承该基类。 HAL提供必须由驱动程序实现的纯虚拟功能。 (不一定是public个。)

发布HAL时,将提供所有受支持的驱动程序。但是应用程序应仅链接相关的驱动程序。应用程序不需要知道该驱动程序的内容,但是它确实需要知道哪个MCU是目标版本。

答案 1 :(得分:0)

现代CMake具有目标和属性。

因此,当您构建/导出某些特定的库/目标时,可以将target_compile_definitionsINTERFACE添加。

这会将定义添加到在编译过程中将使用此库的任何目标。