LWIP -自定义内存对齐

#define MEM_SIZE 15

#define MEM_ALIGNMENT 4

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

其中MEM_SIZE  为要申请对齐字节数。MEM_ALIGNMENT 为对齐方式,4字节或2字节,1字节都可以


自己的理解:

所谓的 内存对其,就是讲内存数据个数对齐,假如对齐方式为4个字节,则需要的内存块应该为4的倍数。


假如要申请一个13个字节的内存块,要求对齐方式为4个字节,则内存块的实际大小应该为4的倍数,计算方式就是

LWIP_MEM_ALIGN_SIZE(13) 结果为(13+4-1)&~(4-1)=(0001 0000)&(1111 1100)=0001 0000=16

则内存块的实际大小为16个字节。


假如要申请一个14字节的内存块,且对齐方式要求也为4个字节,则内存块实际大小为:

LWIP_MEM_ALIGN_SIZE(14) 结果为(14+4-1)&~(4-1)=(0001 0001)&(1111 1100)=0001 0000=16

则内存块大小仍为16个字节。即4的倍数。


假如要申请一个12字节的内存块,且对齐方式要求也为4个字节,则内存块实际大小为:

LWIP_MEM_ALIGN_SIZE(12) 结果为(12+4-1)&~(4-1)=(0000 1111)&(1111 1100)=0000 1100=12

则内存块大小为12个字节。因为12就是4的倍数。所以申请后的内存空间即为12个字节。



下面是别人写的内存对齐的理解,有助于大家进一步理解内存对齐的意义。

http://capacity.blog.163.com/blog/static/20866413120125298408973/

在小型嵌入式系统中,往往需要自己设立内存管理模块,而内存对齐对后面的数据存储有着很大的影响。结合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的大小,使它符合上面的规则。

你可能感兴趣的:(USB/以太网/通信接口)