OpenEdv-开源电子网

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

关于lwip中数组定义时内存对齐的一丝丝见解(MEM_ALIGNMENT)

[复制链接]

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3769
金钱
3769
注册时间
2015-4-26
在线时间
763 小时
发表于 2017-1-11 12:57:22 | 显示全部楼层 |阅读模式
朱胜林大大写的《嵌入式网络那些事-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)以后的数组元素在程序中永远不会用到。
我有故事,你有酒吗
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3769
金钱
3769
注册时间
2015-4-26
在线时间
763 小时
 楼主| 发表于 2017-1-11 13:02:34 | 显示全部楼层
关于上述指针p的验证:
此处贴上memp_init的部分代码[mw_shl_code=applescript,true]/**
* Initialize this module.
*
* Carves out memp_memory into linked lists for each pool-type.
*/
void
memp_init(void)
{
  struct memp *memp;
  u16_t i, j;
  memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);[/mw_shl_code]
memp即为指向memp_memory的指针,LWIP_MEM_ALIGN()是对memp进行偏移以确保内存对齐
我有故事,你有酒吗
回复 支持 反对

使用道具 举报

2

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2014-12-29
在线时间
36 小时
发表于 2017-1-11 13:38:14 | 显示全部楼层
本帖最后由 hhlh2l 于 2017-1-11 13:50 编辑

给数组增加MEM_ALIGNMENT - 1个字节的空间是为了避免因自己或其他程序有非对齐数据时发生误操作;
是内存安全的一种;
回复 支持 反对

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
12338
金钱
12338
注册时间
2015-11-5
在线时间
2127 小时
发表于 2017-1-11 13:40:55 | 显示全部楼层
FreeRTOS的内存管理方案的数组定义跟这个类似,内存初始化时会检查内存堆首地址是否8字节对齐,
如果没对齐就需要修正内存堆的首地址,丢弃数组前面没有对齐的几个字节
拿来长岛冰茶换我半晚安睡
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-1-11 15:35:35 | 显示全部楼层
很多的系统和协议栈之类的都会有字节对齐处理的。
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-9 02:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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