发新帖我要提问
12
返回列表
打印

字节对齐问题

[复制链接]
楼主: sxy4517
手机看帖
扫描二维码
随时随地手机跟帖
21
sxy4517 发表于 2020-11-3 10:13
怎么个取消方法

一般通讯或者数据存储读取的时候才会关注这个问题,基本都是做结构体指针操作时候才会用得上,结构体取消字节对齐就好了。具体的搜索去

使用特权

评论回复
评论
憨厚诚实大叔 2020-11-3 13:45 回复TA
@sxy4517 :这个时候取消字节对齐,让他们在内存挨个排着就可以了,莫纠结。 
sxy4517 2020-11-3 11:46 回复TA
恩,说得对。我就是在这两个地方遇到了这个问题。一个是往EEPROM存储数据的时候,一个是串口通信的时候。 
22
sxy4517|  楼主 | 2020-11-3 11:47 | 只看该作者
憨厚诚实大叔说得对,大家看一下。

使用特权

评论回复
23
sxy4517|  楼主 | 2020-11-3 11:47 | 只看该作者
21楼说得对。

使用特权

评论回复
24
sxy4517|  楼主 | 2020-11-3 13:51 | 只看该作者
憨厚诚实大叔 发表于 2020-11-3 11:32
一般通讯或者数据存储读取的时候才会关注这个问题,基本都是做结构体指针操作时候才会用得上,结构体取消 ...

恩,说得对。

使用特权

评论回复
25
sxy4517|  楼主 | 2020-11-3 15:46 | 只看该作者
有没有人知道stm32f429用cubemx生成代码时,怎么看默认是几字节对齐?

使用特权

评论回复
26
sxy4517|  楼主 | 2020-11-4 08:02 | 只看该作者
顶一下,感觉大家讨论的还是不够彻底,例如有些地方为什么用到了8字节对齐?

使用特权

评论回复
27
sxy4517|  楼主 | 2020-11-4 08:05 | 只看该作者
需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据,如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short,第三次为char,然后组合得到整型数据。

使用特权

评论回复
评论
zyj9490 2020-11-4 09:26 回复TA
@sxy4517 :取变量,地址总线永远把低二位清零。可以看权威指南。 
sxy4517 2020-11-4 09:13 回复TA
@zyj9490 :恩 
zyj9490 2020-11-4 08:50 回复TA
总线永远取的四个字节,32位ARM,都是通过控制器运算得到非4倍数的变量。 
zyj9490 2020-11-4 08:49 回复TA
如果02地址代表一个字节的变量,一次性从00取四个字节,控制器运算成字节变量,如果是半字,还是一样,如果是四字节,要分二次取,第一取从00,取四个字节,第二次从04取四个字节,最后拼成四个字节的变量。 
28
sxy4517|  楼主 | 2020-11-4 09:12 | 只看该作者
现在将取消方法公布如下:
#pragma pack (1)
typedef struct{
        int a;
        char b;
        double c;
        char d[10];
}Test_TypeDef;
#pragma pack ()
#pragma pack (n)  :n表示使用指定n个字节对齐。

#pragma pack ():取消自定字节对齐,恢复默认。

使用特权

评论回复
29
sxy4517|  楼主 | 2020-11-4 12:41 | 只看该作者
#pragma pack(4)   //按4字节对齐,但实际上由于结构体中单个成员的最大占用字节数为2字节,因此实际还是按2字节对齐.

为什么是最大占用字节数为2字节?有人知道吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则