论坛元老
 
- 积分
- 3769
- 金钱
- 3769
- 注册时间
- 2015-4-26
- 在线时间
- 763 小时
|
朱胜林大大写的《嵌入式网络那些事-STM32物联实战》看了好几遍,每次都是看不明白关于数组memp_memory的定义(见源码Memp.c第170行)[mw_shl_code=applescript,true]/** This is the actual memory used by the pools (all pools in one big block). */
static u8_t memp_memory[MEM_ALIGNMENT - 1
#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include "lwip/memp_std.h"
];[/mw_shl_code]
终于在今天恍然大悟,特在此发帖帮助后来者。正文:
上边的宏定义、头文件解释起来太费劲,故在此做个假定:需要定义的数组长度为n。则上述定义可描述为[mw_shl_code=applescript,true]static u8_t memp_memory[MEM_ALIGNMENT-1+n];[/mw_shl_code]那么问题来了,为什么数组长度要比需要的多 MEM_ALIGNMENT-1 ?此处是为了内存对齐而设定的。在程序中对此数组的调用并非通过数组名,而是通过定义一个指针(假定此指针名为p)指向此数组,通过此指针间接引用。若数组首元素地址是内存对齐的,那么毫无疑问p=memp_memory,则此数组中n个元素后的(MEM_ALIGNMENT - 1 )个元素永远不会用到;若数组首元素地址不是内存对齐,则p后移直到p指向的地址内存对齐,此时此数组中的有效数据为*p~*(p+n),p后移跳过的元素及(p+n)以后的数组元素在程序中永远不会用到。
|
|