我正在做一个C ++(带有cmake)嵌入式HAL层,并试图添加一个特定于某些MCU的库。现在,这里的问题是从上层访问库函数。
我的解决方案是使用该特定板卡的cmake文件定义一个宏,在该宏上库(和函数)将被排除或包含在上层。这需要跟踪宏->库和函数对。
在可伸缩性方面,这并不是一个好方法。是否有一些更方便的方法(从可伸缩性和传统角度来看)来实现特定于硬件的功能?
最佳答案
如果您有一个通用HAL,其中包括一个仅在某些MCU上可用的库,则唯一的解决方案是肮脏的条件编译器开关:#ifndef SOMETHING #include "library.h" ...
。这些很快使代码不可读,因此它们始终是不得已的方法。
但是,所有这些都表明您存在程序设计问题。您的程序应按以下方式工作(调用顺序):
应用程序代码-> HAL-> MCU专用驱动程序
这三层中的每一层都不了解其他内部的任何内容。因此,自然而然地,HAL内不应有任何特定于MCU的东西。相反,它应该在驱动程序内部。即使在极少数情况下,驱动程序中的代码在其他方面都是相同的(例如,使用相同系列的不同MCU衍生产品时)。
因此,在实践中,您最终将得到例如HAL的“ spi_library.h”以及诸如“ MCUX_SPI.c”,“ MCUY_SPI.c”之类的许多驱动程序,其中“ MCUX”和“ MCUY”是不同的MCU零件号。
在C ++中,这通常是通过将HAL作为抽象基类实现的,每个MCU实现都继承该基类。 HAL提供必须由驱动程序实现的纯虚拟功能。 (不一定是public
。)
发布HAL时,请提供所有受支持的驱动程序。但是应用程序应仅链接相关的驱动程序。应用程序不需要知道该驱动程序的内容,但是它确实需要知道哪个MCU是目标版本。