OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2941|回复: 1

归于结构体指针的内存对齐问题

[复制链接]

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2017-11-22 15:46:55 | 显示全部楼层 |阅读模式
1金钱
用链表做内存管理是发现一个不明白的地方
typedef struct node * PNode;
typedef struct node  
{   u32 offset;
    u32 b_size; //本节点带的内存块大小  
    PNode Pnext;//链域   
}Node;
如上;这个结构应该占的空间是4*3=12字节,
定义PNode P;P = (PNode)malloc(sizeof(Node));
问:1.此时P在内存中是不是12字节对齐,也就是P的数值*12才是物理内存中对应的8字节地址?
      2.__align(4) u8 membase[MEM_MAX_SIZE];改成__align(12) u8 (PNode)membase[MEM_MAX_SIZE];是不是就成12字节对齐,其首地址就可以(PNode)membase转换而不造成地址对齐出错?

最佳答案

查看完整内容[请看2#楼]

百度如下说: 四、ARM平台的对齐问题 在ARM中,有ARM和Thumb两种指令。 ARM指令:每执行一条指令,PC的值加4个字节(32bits).一次访问4字节内容,该字节的起始地址必须是4字节对齐的位置上,即地址的低两位为bits[0b00],也就是说地址必须是4的倍数。 Thumb指令:每执行一条指令,PC的值加2个字节(16bits).).一次访问2字节内容,该字节的起始地址必须是2字节对齐的位置上,即地址的低两位为bits[0b0],也就是说地址必须是2的 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
862
金钱
862
注册时间
2015-2-12
在线时间
354 小时
发表于 2017-11-22 15:46:56 | 显示全部楼层
百度如下说:
四、ARM平台的对齐问题
在ARM中,有ARM和Thumb两种指令。
ARM指令:每执行一条指令,PC的值加4个字节(32bits).一次访问4字节内容,该字节的起始地址必须是4字节对齐的位置上,即地址的低两位为bits[0b00],也就是说地址必须是4的倍数。
Thumb指令:每执行一条指令,PC的值加2个字节(16bits).).一次访问2字节内容,该字节的起始地址必须是2字节对齐的位置上,即地址的低两位为bits[0b0],也就是说地址必须是2的倍数。
     遵循以上方式叫对齐(aligned)方式,不遵守这样方式称为非对齐(unaligned)的存储访问操作。

五、ARM平台字节对齐关键字
1. __align(num)
   用于修改最高级别对象的字节边界。
A、在汇编中使用LDRD或者STRD时,就用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。
B、该修饰对象的命令最大是8个字节限制,可让2字节的对象进行4字节
   对齐,但是不能让4字节的对象2字节对齐。
C、 __align是存储类修改,他只修饰最高级类型对象不能用于结构或者函数对象。
   
2. __packed
__packed是进行一字节对齐。
A、不能对packed的对象进行对齐;
B、所有对象的读写访问都进行非对齐访问;
C、float及包含float的结构联合及未用__packed的对象将不能字节对齐;
D、__packed对局部整形变量无影响;
D、强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定
义为packed __packed int* p; //__packed int 则没有意义。
3. __unaligned
   用于修饰该变量可按照非对齐访问。

尝试着回答你的问题:
1、是。无论ARM和Thumb两种指令,你的数据结构长度符合4或2的倍数。
2、因第1条原因,故你的设置_align(12),同样不会产生对齐问题,与1结果一样。

欢迎批评指正!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 11:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表