首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内部闪存中C结构的对准

内部闪存中C结构的对准
EN

Stack Overflow用户
提问于 2011-12-15 15:58:38
回答 4查看 5.2K关注 0票数 7

我有一个配置结构,我想把它保存在ARM皮层M3的内部闪存中。根据规范,存储在内部闪存中的数据必须对齐到32位。因为我的结构中有很多布尔值和字符,所以我不想使用32位来存储8位……我决定使用__packed预处理器杂注打包结构,然后当我将它保存为一个完整的结构时,我只需要确保结构大小可以被4整除(4字节=32位),如果需要的话,我通过添加填充字节来做到这一点。目前,在开发过程中,我更改了很多结构,为了使其与32位对齐,我需要一直更改填充字节。目前,这个结构看起来像这样

代码语言:javascript
复制
typedef __packed struct
{
uint8_t status;
uint16_t delay;
uint32_t blabla;
uint8_t foo[5];
uint8_t padding[...] // this has to be changed every time I alter the structure.
} CONFIG;

有没有更好的方法来实现我正在做的事情?我在嵌入式编程方面是个新手,我想确保我没有犯错。

编辑:请注意。数据持久存储在内部闪存的末尾,因此省略填充将不起作用...

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-15 16:19:01

也许这是一个想法:

代码语言:javascript
复制
typedef __packed struct {
    uint8_t status;
    uint16_t delay;
    uint32_t blabla;
    uint8_t foo[5];
} CONFIG;

typedef __packed struct {
    CONFIG cfg;
    uint8_t padding[4 - (sizeof(CONFIG) % 4)]
} CONFIGWRAPPER;
票数 4
EN

Stack Overflow用户

发布于 2011-12-15 16:28:39

解决方案1:您可以将其放入一个包含结构和字符数组的联合中:

代码语言:javascript
复制
union
{
  CONFIG config;
  uint8_t total_size[32];
} my_union;
票数 4
EN

Stack Overflow用户

发布于 2011-12-15 16:54:27

首先,通常要避免压缩对齐,如果您最终得到的数据未与其自然边界对齐,则当您尝试访问某些CPU时,它们会发出陷阱。

首先,按顺序存储成员,这样编译器就不会为了对齐而添加空格(或者,如果添加空格,它会在末尾添加空格)。如果可以,让1.成员具有您想要的对齐要求-因为这会迫使编译器至少对结构进行如此多的对齐。

这需要一些关于你的平台和编译器的对齐需求的知识,比如去掉填充数组,以及如何改变

代码语言:javascript
复制
typedef struct
{
uint8_t status;
uint16_t delay;
uint32_t blabla;
uint8_t foo[5];
uint8_t padding[...];
} CONFIG;

代码语言:javascript
复制
typedef struct
{
uint32_t blabla;
uint16_t delay;
uint8_t status;
uint8_t foo[5];
} CONFIG;

然后告诉编译器这个结构需要4个字节的对齐(在这种情况下,它可能已经这样做了,因为第一个成员有4个字节或更多的对齐要求)。例如,与gcc一起使用attribute((__aligned__(4))

然后编写一个小的测试程序来验证你的对齐需求(这只是一个在你的struct上使用sizeof()和alignof()的小程序),这甚至会告诉你你是否需要为要对齐的结构添加指令。将该程序作为构建/打包的一部分运行。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8516835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档