0

我有一个支持两个版本的固件,stm32f 系列和 stm32g 系列。为了简化部署过程中的选择,是否可以为两者构建一个固件?

固件使用来自 stm 的 HAL 并将它们构建为一个将在函数名称、变量名称等方面产生冲突。

我正在尝试的一个选项是将所有 HAL 函数和其他变量或类型重命名为每个特定的 MCU,并将它们放在一个包装器中,以便我可以同时包含两者。

有没有其他方法可以解决这个问题?

4

1 回答 1

1

您的想法似乎很有可能,但需要大量工作。在多种情况下,我构建了与不同 PCB 上的相同 MCU 兼容的软件,因此您只是将其提升到了另一个层次。

从项目的角度来看,您使工程部门的工作变得更加困难,从而使采购部门的工作变得更加轻松。您需要估计这是否值得。在这个半导体短缺的时代,它可能是。

我首先要考虑的是两个 MCU 共有多少应用程序代码。如果您有足够的闪存不仅可以存储两个芯片的驱动程序副本,还可以存储两个完整的应用程序,那么最简单的方法就是编写两个完整的构建版本。然后,一个微型引导加载程序可以检测处理器 ID 并跳转到适当的块。您可以有一个最终构建步骤,将这些组合成一个用于生产的二进制文件。

如果你不能这样做,那么我接下来要看的是尝试模块化你的驱动程序并单独构建它们。您已经发现重复的函数和变量名称会出现问题,但您还必须使用单独的编译器标志进行编译,尤其是宏定义。

许多 linux 内核驱动程序包含相同的函数名称,但所有函数都是静态的,因此它们不会进入符号表。指向这些静态函数的指针被分配给一个结构的成员,这个结构是内核其余部分访问驱动程序的方式。你可以做类似的事情。为使用您自己的类型的每个驱动程序编写简单的包装器函数,并且可以通过仅包含包装器的公共标头而不包含任何 STM32 HAL 标头来调用。为使用相同原型的每个 MCU 制作单独的包装函数。将这些函数放在一个结构中。然后,您将需要编译并使用一些花哨的链接器标志来隐藏符号表上除该结构之外的所有符号。这样,您可以链接两组驱动程序而无需重复符号。

如果您不想这样做,则必须编辑 HAL 代码的源代码。我只会将此作为最后的手段,并尽一切可能使其自动化。编写一些脚本,对所有标识符进行搜索和替换,然后在它们的声明中添加静态,或者在它们的名称中添加前缀。尝试以这样一种方式制作脚本,即当 HAL 有新版本时它仍然可以工作(即:不要只使用差异补丁)。请记住,即使在您编辑了代码之后,您仍然必须使用不同的标志编译两个驱动程序,但是一旦您编译完成,您就可以将它们链接在一起。

于 2021-12-11T10:12:31.870 回答