Tar*_*ing 2 embedded compilation stm32 static-libraries
我有一个 STM32L0 的 Keil STM32 项目。我有时(比我想要的更频繁)必须更改包含路径或全局定义。这将触发所有代码的完全重新编译,因为它需要 \xe2\x80\x98check\xe2\x80\x99 是否因这些更改而更改了行为。问题是:我没有必要更改 HAL 的相关参数,因此不需要(据我所知)这些文件完全重新编译。重新编译需要相当多的时间,因为我包含了 STM32L0 的所有 HAL 驱动程序。
\n\n一个好的做法是创建一个单独的项目,将 HAL 编译为单个库并将其包含在我的主项目中吗?(当然,这会针对每个微控制器单独完成,因为它们具有不同的 HAL)。
\n\n附:这个问题不一定只对这个特定的例子有用,但这个例子给了这个问题一定的范围。
\n\npps。对于不熟悉 STM32 HAL 的人。它是程序与底层硬件接口的标准化接口。它以.c和.h文件形式提供,而不是 STD/STL 的预编译形式。
更新
\n\n以下是我的示例项目中需要管理的定义的示例:
\n\n\n\n\n\n
STM32L072xx,USE_B_BOARD,USE_HAL_DRIVER, REGION_EU868,DEBUG,TRACE
只有STM32L072xx, 和对于配置 HAL 库很有用,因此当我从定义更改为未定义DEBUG时,我不需要重新编译 HAL 。TRACE因此,在我看来,HAL 可以单独管理。
\n编辑
鉴于投票结果很接近:我已阅读“不要问”部分,我的问题旨在建设性地增加构建 STM32 程序的知识,并找到有关如何更有效地使用 HAL 库的最佳实践。我还没有发现任何关于将 HAL 构建为静态库的问题,因此这个问题至少是唯一的。这个问题也旨在邀请一个丰富的答案,详细说明将 HAL 构建为单独的静态库的优点/缺点。
\n这里的答案是..这取决于。正如评论中已经指出的,这取决于您计划如何管理项目。公正地回答你的问题:
选项 #1 - 在项目中直接拥有 HAL 源意味着每次其(和底层)标头中的任何内容发生更改时都会重建 HAL,您已经注意到了这一点。它的缺点是构建时间较长。好处 - 您确信您构建的就是您得到的。
选项 #2 - 将 HAL 作为预编译静态库。优点 - 构建时间更短,缺点 - 您无法再绝对确定您包含的 HAL 库是否真正按照您的预期工作。特别是,您需要以某种方式确保所有 s 与#define构建库时完全相同。这包括项目范围的定义(DEBUG等STM32L072xx),以及 HAL 配置文件中的任何内容(stm32l0xx_hal_conf.h)。
看看您是 Keil 用户 - 也许这只是启用多核构建的问题?请参阅此链接:http://www.keil.com/support/man/docs/armcc/armcc_chr1359124201769.htm。HAL 库并不是很大,因此在重建其源文件时应该考虑构建时间。
如果我要表达我的意见和经验 - 就我个人而言,我不会这样做,因为它可能会导致可靠性降低或副作用,这些副作用将很难诊断,并且当您添加更多源文件和更多库(例如这。更不用说添加更多的人来参与该项目并向他们解释如何“在更改给定的头文件集或项目范围的定义时需要记住重建 X 库”。
事实上,我所处理的代码库也遇到了同样的困境 - 它总共包含超过 10k 个源文件和头文件,其中一些是特定于配置的,而许多是共享的。它是高度模块化的,使我们能够通过配置现有代码(主要是通过一组头文件)来快速创建新的东西(硬件和软件方面)。然而,由于此配置是通过标头完成的,因此对标头进行更改通常意味着重建项目的很大一部分。尽管构建时间有时会很烦人,但出于上述原因,我们选择不创建静态库。对我个人来说,最好优先考虑可靠性,就像“我知道我构建什么”一样。
如果我要给出一些有助于避免随着项目变大而进行重建的一般提示:
避免全局标头保存所有配置。通常很容易将所有配置推到一个地方,为这个文件中的每个软件模块创建漂亮的注释和部分。这种方式更容易管理(直到该文件变得太大),但由于该文件非常常见,这意味着对其进行的任何更改都将导致完全重建。将此类文件拆分为与项目中每个模块相对应的单独标头。
仅在需要的地方包含头文件。我有时会看到一种方法,其中创建的头文件仅“捆绑”其他头文件,并且稍后包含此类头文件。在这种情况下,对任何这些“较小”标头进行更改都将导致必须重新编译所有源文件(包括较大文件)。如果这样的文件不存在,那么只有明确包含该一个小标头的源代码才需要重新编译。显然,这里有一条线 - 包含太“低级”的标头可能也不是最好的主意,例如,它们可能不应该作为可能随时更改的内部库文件包含在内。
优先考虑在源文件中包含标头而不是标头文件。如果您有一对自己的*.c( *.cpp) 和*.h文件 - 假设temp_logger.c/.h您需要 ADC - 那么除非您确实需要在标头中进行一些 ADC 定义(您可能不会),然后将 ADC 标头文件包含在您的temp_logger.c文件中。稍后,所有使用这些temp_logger函数的文件都不必重新编译,以防 HAL 再次重建。