Chinaunix首页 | 论坛 | 博客
  • 博客访问: 249068
  • 博文数量: 128
  • 博客积分: 65
  • 博客等级: 民兵
  • 技术积分: 487
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-24 17:43
个人简介

人生境界:明智、中庸、诚信、谦逊

文章分类

全部博文(128)

文章存档

2014年(12)

2013年(116)

我的朋友

分类: 嵌入式

2013-03-13 09:39:01

在小型嵌入式系统中,往往需要自己设立内存管理模块,而内存对齐对后面的数据存储有着很大的影响。结合LWIP协议栈介绍一个内存对齐的方式,参见下面程序:

这是对齐方式为1字节

#define MEM_SIZE 15 #define MEM_ALIGNMENT 1 #define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))

LWIP_MEM_ALIGN_SIZE(MEM_SIZE) = 15;//当1字节对齐的时候,内存对齐(也可以认为是内存调整)后的值为15
	
	

这是对齐方式为2字节

#define MEM_SIZE 15 #define MEM_ALIGNMENT 2 #define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))

LWIP_MEM_ALIGN_SIZE(MEM_SIZE) = 16;//当1字节对齐的时候,内存对齐(也可以认为是内存调整)后的值为16
	

这是对齐方式为4字节

#define MEM_SIZE 15 #define MEM_ALIGNMENT 4 #define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))

LWIP_MEM_ALIGN_SIZE(MEM_SIZE) = 16;//当1字节对齐的时候,内存对齐(也可以认为是内存调整)后的值为16
下面分析一下此种方式的要点,
1字节对齐:地址的LSB位可以是1,比如地址0x00000001。
字节对齐:地址的LSB位要位0,比如  地址0x00000002。
4 字节对齐:地址的第0位和第1位要位0,比如  地址0x00000004。
这就可以理解这个宏定义的意义了#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
调整size的大小,使它符合上面的规则。
阅读(1046) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~