OpenEdv-开源电子网

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

请教一个内存管理中的问题

[复制链接]

8

主题

93

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-9-22
在线时间
0 小时
发表于 2014-3-1 17:11:56 | 显示全部楼层 |阅读模式
    在内存管理那个实验中,有两个数组:

    __align(4) u8 mem1base[MEM1_MAX_SIZE];
    __align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));

    以第一行的代码为例,定义了一个数组 mem1base,数组大小为 MEM1_MAX_SIZE,数组的元素类型是 __align(4) u8.
请问:

    (1)这里的 __align(4) 该怎么理解????

    (2)为什么文中说“__align(4)定义内存池为 4 字节对齐,这个非常重要!如果不加这个限制,在某些情况下(比如分配内存给结构体指针),可能出现错误,所以一定要加上这个。”?????

    恳请指教。。。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-1 21:14:17 | 显示全部楼层
回复【楼主位】shr5791:
---------------------------------
有些操作参数是必须4字节甚至8字节对齐,否则访问就会有问题,引起死机。
比如printf的时候,很容易出现这种情况。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

93

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2014-3-1 21:48:09 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子兄,那么这里的__align(4) u8 mem1base[MEM1_MAX_SIZE]内存该怎么对齐呢?第一个元素会放在什么样的地址中,第二个,第三个呢???
难道是每个元素都存储在4的倍数的地址中吗?这样的话这个数组每两个元素之间就间隔了3个元素。还是不懂怎么对齐的,,,网上说的很少,MDK的Help说的也不明不白的。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-1 22:03:17 | 显示全部楼层
回复【3楼】shr5791:
---------------------------------
其实就是数组的首地址4字节对齐就可以了,首地址肯定是4的倍数。0,4,8,之类的。。。
然后malloc每次是分配32字节,这样后续每次分配首地址都必定是4的倍数。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

93

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2014-3-1 22:08:51 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
哦,原来是这样理解的,谢谢原子兄!
回复 支持 反对

使用道具 举报

86

主题

984

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-3-12 14:53:21 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
其实就是数组的首地址4字节对齐就可以了,首地址肯定是4的倍数。0,4,8,之类的。。。 
然后malloc每次是分配“32字节”,这样后续每次分配首地址都必定是4的倍数。



这里说的应该是“32位”,还是32“字节”????
合肥-文盲
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-12 22:56:27 | 显示全部楼层
回复【6楼】合肥-文盲:
---------------------------------
32字节
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

86

主题

984

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-3-12 23:24:34 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
意思是一个数组8个元素?
合肥-文盲
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-13 00:05:25 | 显示全部楼层
回复【8楼】合肥-文盲:
---------------------------------
啥意思?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

86

主题

984

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-3-13 08:57:13 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
我也不太理解字节对齐,据说可以提升CPU执行效率
其实就是数组的首地址4字节对齐就可以了,首地址肯定是4的倍数。0,4,8,之类的。。。  
然后malloc每次是分配“4字节”,这样后续每次分配首地址都必定是4的倍数。 
我不知道这里为什么是32字节,而不是四字节
合肥-文盲
回复 支持 反对

使用道具 举报

12

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-28
在线时间
8 小时
发表于 2015-3-13 09:40:01 | 显示全部楼层
回复【10楼】合肥-文盲:
---------------------------------
因为原子哥写的内存管理,就是以32个字节为单位分配内存的。你看看代码就知道了,不管你申请的内存大小是多少,都会分配给你32个字节整数倍的内存。
持续而安静地投入
回复 支持 反对

使用道具 举报

86

主题

984

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-3-13 11:14:52 | 显示全部楼层
回复【11楼】磨剑:
---------------------------------
OK  明白
合肥-文盲
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 20:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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