首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HAL中的硬件专用库

问HAL中的硬件专用库
EN

Stack Overflow用户
提问于 2018-10-04 10:40:12
回答 2查看 321关注 1票数 0

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

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

就可伸缩性而言,这并不是一个好方法。是否有更方便的方法(从可伸缩性和遗留的角度)来实现特定于硬件的能力?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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是目标构建的。

票数 2
EN

Stack Overflow用户

发布于 2018-10-04 11:35:20

现代CMake具有目标和属性。

因此,当您构建/导出特定的库/目标时,可以使用INTERFACE添加INTERFACE。

这将向编译期间使用此库的任何目标添加定义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52644706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档