我如何保证数据的位置在一个单独的链接器部分不改变,当我扩展它?



在嵌入式c++上下文中,我在闪存中定义了一个单独的链接器部分,远离其余的代码/数据,我在其中存储用户可以在运行时修改的数据。(EEPROM仿真,基本上)

我还有一个自定义设备固件更新程序,它将覆盖flash中的只读代码/数据,除了本节(和固件更新程序),因为我希望用户所做的持久配置更改能够持续存在,即使他们执行固件更新。

作为这些固件的一部分,我可以扩展用户可以执行的配置数量。我有一个代码文件,它本质上是一个全局变量列表,它在flash中给定的位置被链接,并在末尾添加行。当然,我真的想确保之前在这里的变量在内存中的位置不会改变。

我能保证什么?根据全局变量的内存布局,我不确定我能保证在文件末尾顺序添加行不会改变前面变量的位置。

我相信结构体中具有相同访问级别的数据成员总是由编译器在内存中排序,所以我可以在某处定义一个结构体,在我专用的链接器部分中实例化它,并在将来的更新中扩展它。但即便如此,我对对齐保证的了解还不够多,所以我仍然不确定我是否安全。

那么,我该怎么做呢?

一些编译器和/或链接器通过一些(对我们用户来说)未知的(散列?)算法来排序变量。如果您重命名一个变量或添加一个变量,每个变量都可能改变其位置。

然而,有帮助,正如标准在6.5.2.3章第6段(我强调)所说:

有一个特殊的保证是为了简化联合的使用:如果一个联合包含几个结构体,它们共享一个共同的初始序列(见下文),并且如果联合对象当前包含这些结构体中的一个,则允许检查其中任何一个结构体的公共初始部分,只要该联合体的已完成类型的声明是可见的。两个结构体共享一个或多个初始成员的序列,如果对应的成员具有兼容的类型(对于位字段,宽度相同)。

因此,如果您为保存的数据定义了一个结构,您可以毫无顾虑地添加新成员。使用此结构定义保存值的单个变量。

甚至可以定义结构的联合,这些结构具有共同的初始成员序列,可以用来区分后面的成员序列。

无论如何,您需要通过适当的属性和链接器脚本条目来定位这个单一变量。但是你已经这样做了。

最新更新