我正在做一个C++ (用cmake)嵌入HAL层,并试图添加一个特定于某些MCU的库。现在的问题是从上层访问库函数。
我对此的解决方案是为特定的板使用cmake文件来定义宏,其中库(和函数)要么被排除在外,要么包含在上层。这需要跟踪宏->库和函数对。
就可伸缩性而言,这并不是一个好方法。是否有更方便的方法(从可伸缩性和遗留的角度)来实现特定于硬件的能力?
发布于 2018-10-04 11:17:48
如果您有一个通用的HAL,其中包含一个仅在某些MCU上可用的库,那么唯一的解决方案是肮脏的条件编译器开关:#ifndef SOMETHING #include "library.h" ...。这些都很快使代码不可读,因此它们始终是最后的手段。
然而,所有这些都表明您有一个程序设计问题。您的程序应该像这样工作(调用顺序):
应用程序代码-> HAL ->单片机专用驱动程序
这三个层中的每一个都不知道其他层中的任何内容。因此,在HAL中自然不应该有任何特定于MCU的东西.相反,它应该在司机的内部。即使在很少的情况下,驱动程序中的代码在其他方面是相同的(例如,当使用相同家族的不同MCU导数时)。
因此,在实践中,您将得到例如"spi_library.h“,这是HAL,和许多驱动程序,如"MCUX_SPI.c","MCUY_SPI.c”,其中"MCUX“和"MCUY”是不同的单片机部件编号。
在C++中,这通常是通过实现HAL作为抽象基类来完成的,每个MCU实现都继承它。HAL提供纯粹的虚拟功能,这些功能必须由驱动程序实现。(不一定是public的。)
发布HAL时,提供所有受支持的驱动程序。但是应用程序只应该链接相关的驱动程序。应用程序不需要知道驱动程序的内容,但是它需要知道哪个MCU是目标构建的。
发布于 2018-10-04 11:35:20
现代CMake具有目标和属性。
因此,当您构建/导出特定的库/目标时,可以使用INTERFACE添加INTERFACE。
这将向编译期间使用此库的任何目标添加定义。
https://stackoverflow.com/questions/52644706
复制相似问题