当我扩展它时,如何保证单独链接器部分中数据的位置不会改变?
How can I guarantee the position of data inside a separate linker section does not change when I extend it?
在嵌入式 C++ 上下文中,我在闪存中定义了一个单独的链接器部分,远离 code/data 的其余部分,我在其中存储用户可能在运行时修改的数据。 (基本上是 EEPROM 仿真)
我还有一个自定义设备固件更新程序,它将覆盖闪存中的只读 code/data,除了这部分(以及固件更新程序的部分),因为我希望持久配置更改用户已做出坚持,即使他们执行固件更新也是如此。
作为这些固件的一部分,我可能会扩展用户可以进行的配置量。所以,我有一个代码文件,它本质上是一个全局变量列表,它在闪存中的给定位置被链接,并会在末尾添加行。当然,我真的很想确保之前在这里的变量在内存中的位置不会改变。
我对此有何保证?按照 ,我不确定我能否保证在文件末尾顺序添加行不会改变先前变量的位置。
我相信结构中相同访问级别的数据成员将始终由编译器在内存中排序,因此我可以在某处定义一个结构,在我的专用链接器部分实例化它并在未来更新时扩展它。但即便如此,我对对齐保证的了解还不够多,所以我仍然不确定我是否安全。
那么,我应该怎么做呢?
几个编译器 and/or 链接器通过一些(对我们用户而言)未知(散列?)算法对变量进行排序。如果您重命名一个变量或添加一个变量,每个变量都可能改变其位置。
但是,正如标准在第 6.5.2.3 章第 6 段中所说的那样(我强调):
One special guarantee is made in order to simplify the use of unions: if a union contains several structures that share a common initial sequence (see below), and if the union object currently contains one of these structures, it is permitted to inspect the common initial part of any of them anywhere that a declaration of the completed type of the union is visible. Two structures share a common initial sequence if corresponding members have compatible types (and, for bit-fields, the same widths) for a sequence of one or more initial members.
因此,如果您为保存的数据定义一个结构,您就可以毫无顾虑地添加新成员。使用此结构定义保存值的单个变量。
更重要的是,您可以定义结构的联合,这些结构具有共同的初始成员序列,您可以使用该序列来区分后续成员的序列。
无论如何,您需要通过适当的属性和链接描述文件条目来定位这个单一变量。但是你已经这样做了。
在嵌入式 C++ 上下文中,我在闪存中定义了一个单独的链接器部分,远离 code/data 的其余部分,我在其中存储用户可能在运行时修改的数据。 (基本上是 EEPROM 仿真)
我还有一个自定义设备固件更新程序,它将覆盖闪存中的只读 code/data,除了这部分(以及固件更新程序的部分),因为我希望持久配置更改用户已做出坚持,即使他们执行固件更新也是如此。
作为这些固件的一部分,我可能会扩展用户可以进行的配置量。所以,我有一个代码文件,它本质上是一个全局变量列表,它在闪存中的给定位置被链接,并会在末尾添加行。当然,我真的很想确保之前在这里的变量在内存中的位置不会改变。
我对此有何保证?按照
我相信结构中相同访问级别的数据成员将始终由编译器在内存中排序,因此我可以在某处定义一个结构,在我的专用链接器部分实例化它并在未来更新时扩展它。但即便如此,我对对齐保证的了解还不够多,所以我仍然不确定我是否安全。
那么,我应该怎么做呢?
几个编译器 and/or 链接器通过一些(对我们用户而言)未知(散列?)算法对变量进行排序。如果您重命名一个变量或添加一个变量,每个变量都可能改变其位置。
但是,正如标准在第 6.5.2.3 章第 6 段中所说的那样(我强调):
One special guarantee is made in order to simplify the use of unions: if a union contains several structures that share a common initial sequence (see below), and if the union object currently contains one of these structures, it is permitted to inspect the common initial part of any of them anywhere that a declaration of the completed type of the union is visible. Two structures share a common initial sequence if corresponding members have compatible types (and, for bit-fields, the same widths) for a sequence of one or more initial members.
因此,如果您为保存的数据定义一个结构,您就可以毫无顾虑地添加新成员。使用此结构定义保存值的单个变量。
更重要的是,您可以定义结构的联合,这些结构具有共同的初始成员序列,您可以使用该序列来区分后续成员的序列。
无论如何,您需要通过适当的属性和链接描述文件条目来定位这个单一变量。但是你已经这样做了。