HAL 中的硬件特定库
Hardware specific library in HAL
我正在做一个 C++(使用 cmake)嵌入式 HAL 层并尝试添加一个特定于某些 MCU 的库。现在这里的问题是从上层访问库函数。
我对此的解决方案是使用该特定板的 cmake 文件来定义一个宏,在该宏上,库(和函数)将被排除或包含在上层中。这需要跟踪宏 -> 库和函数对。
从可扩展性的角度来看,这并不是一个好方法。有没有更方便的方法(从可扩展性和遗留的角度)来实现特定于硬件的能力?
如果您有一个通用 HAL,其中包含一个仅在某些 MCU 上可用的库,那么唯一的解决方案是脏条件编译器开关:#ifndef SOMETHING #include "library.h" ...
。这些很快会使代码变得不可读,因此它们始终是最后的手段。
然而,所有这些确实表明您有程序设计问题。你的程序应该像这样工作(调用顺序):
应用程序代码 -> HAL -> MCU 特定驱动程序
这 3 层中的每一层都不知道其他层中的任何内容。所以很自然地,HAL 中不应该有任何特定于 MCU 的东西。相反,它应该在驱动程序内部。即使在驱动程序中的代码在其他方面完全相同的极少数情况下(例如,当使用同一系列的不同 MCU 衍生产品时)。
所以在实践中,你最终会得到例如 "spi_library.h",它是 HAL,还有一些驱动程序,如 "MCUX_SPI.c"、"MCUY_SPI.c",其中 "MCUX" 和"MCUY" 是不同的 MCU 部件号。
在 C++ 中,这通常是通过将 HAL 实现为抽象基础 class 来完成的,每个 MCU 实现都继承它。 HAL 提供必须由驱动程序实现的纯虚函数。 (不一定 public
个。)
发布您的 HAL 时,您提供了所有受支持的驱动程序。但是应用程序应该只 link 相关的驱动程序。应用程序不需要知道该驱动程序的内容,但它确实需要知道哪个 MCU 是目标版本。
现代 CMake 使用目标和属性进行操作。
因此,当您 building/exporting 一些特定的 library/target 时,您可以添加 target_compile_definitions 和 INTERFACE
。
这将为编译期间将使用该库的任何目标添加定义。
我正在做一个 C++(使用 cmake)嵌入式 HAL 层并尝试添加一个特定于某些 MCU 的库。现在这里的问题是从上层访问库函数。
我对此的解决方案是使用该特定板的 cmake 文件来定义一个宏,在该宏上,库(和函数)将被排除或包含在上层中。这需要跟踪宏 -> 库和函数对。
从可扩展性的角度来看,这并不是一个好方法。有没有更方便的方法(从可扩展性和遗留的角度)来实现特定于硬件的能力?
如果您有一个通用 HAL,其中包含一个仅在某些 MCU 上可用的库,那么唯一的解决方案是脏条件编译器开关:#ifndef SOMETHING #include "library.h" ...
。这些很快会使代码变得不可读,因此它们始终是最后的手段。
然而,所有这些确实表明您有程序设计问题。你的程序应该像这样工作(调用顺序):
应用程序代码 -> HAL -> MCU 特定驱动程序
这 3 层中的每一层都不知道其他层中的任何内容。所以很自然地,HAL 中不应该有任何特定于 MCU 的东西。相反,它应该在驱动程序内部。即使在驱动程序中的代码在其他方面完全相同的极少数情况下(例如,当使用同一系列的不同 MCU 衍生产品时)。
所以在实践中,你最终会得到例如 "spi_library.h",它是 HAL,还有一些驱动程序,如 "MCUX_SPI.c"、"MCUY_SPI.c",其中 "MCUX" 和"MCUY" 是不同的 MCU 部件号。
在 C++ 中,这通常是通过将 HAL 实现为抽象基础 class 来完成的,每个 MCU 实现都继承它。 HAL 提供必须由驱动程序实现的纯虚函数。 (不一定 public
个。)
发布您的 HAL 时,您提供了所有受支持的驱动程序。但是应用程序应该只 link 相关的驱动程序。应用程序不需要知道该驱动程序的内容,但它确实需要知道哪个 MCU 是目标版本。
现代 CMake 使用目标和属性进行操作。
因此,当您 building/exporting 一些特定的 library/target 时,您可以添加 target_compile_definitions 和 INTERFACE
。
这将为编译期间将使用该库的任何目标添加定义。