【发布时间】:2025-12-14 22:20:07
【问题描述】:
在嵌入式 C++ 上下文中,我在闪存中定义了一个单独的链接器部分,远离其余代码/数据,我在其中存储用户可以在运行时修改的数据。 (基本上是 EEPROM 仿真)
我还有一个自定义设备固件更新程序,它将覆盖闪存中的只读代码/数据,除了本节(以及固件更新程序的部分),因为我希望用户对持久配置进行更改即使他们执行固件更新,也会持续存在。
作为这些固件的一部分,我可能会扩展用户可以执行的配置数量。所以,我有一个代码文件,它本质上是一个全局变量列表,它在闪存中的给定位置链接,并在最后添加行。当然,我真的很想确保之前在这里的变量在内存中的位置不会改变。
我对此有什么保证?通过Memory layout of globals,我不确定我是否能保证在文件末尾按顺序添加行不会改变先前变量的位置。
我相信结构中相同访问级别的数据成员将始终由编译器在内存中排序,因此我可以在某个地方定义一个结构,在我的专用链接器部分中对其进行实例化,并使用未来的更新对其进行扩展。但即便如此,我对对齐保证的了解也足够多,以至于我对它们知之甚少,所以我仍然不确定自己是否安全。
那么,我该怎么做呢?
【问题讨论】:
-
使用链接器指令文件,在固定地址或偏移处声明段。使用编译器特定的操作(pragma?)将变量分配给段(在源代码中)。因此,例如,我们可以定义一个名为 FLASH 的段,然后在源代码中告诉编译器我们希望将一个变量(或常量)放入 FLASH 段中。在链接器指令文件中,我们将创建 FLASH 段并声明其地址或位置。
-
@ThomasMatthews 这就是我正在做的事情,但是有一个变量文件。如果可能的话,我不想对我的每一个持久变量的地址进行微观管理。
标签: c++ memory linker embedded