内存管理代码分析 stm32

(1)malloc函数用于内存申请,free函数用于内存释放。
(2)内存管理表的项值代表的意义:当该项值为0的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。**比如某项值为10,那么说明包括本项对应的内存块在内,总共分配了10个内存块给外部的某个指针。**
![这里写图片描述](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTcwODA1MTY0MDAxMjI1?x-oss-process=image/format,png)
(3)内寸分配方向:是从顶底的分配方向。即首先从最末端开始找空内存。当内存管理刚初始化的时候,内存管理表全部清零,表示没有任何内存块被占用。
(4)分块式内存管理——分配原理
	当指针p调用malloc申请内存的时候,先判断p要分配的内存块数(m),然后从第n项开始,向下查找,直到找到m块连续的空内存块(即对应内存管理表项为0),然后将这m个内存管理表项的值都设置为m(标记被占用),最后,把最后的这个空内存块的地址返回指针p,完成一次分配。注意,如果当内存不够的时候(找到最后也没找到连续的m块空闲内存),则返回NULL给p,表示分配失败。
(5)分块式内存管理——释放原理
	当指针p申请的内存用完,需要释放的时候,调用free函数实现。free函数先判断p指向的内存地址所对应的内存块,然后找到对应的内存管理表项目,得到p所占用的内存块数目m(内存管理表项目的值就是所分配内存块的数目),将这m个内存管理表项目的值都清零,标记释放,完成一次内存释放。
(6)//内存管理控制器
struct _m_mallco_dev

{
void (*init)(u8); //初始化
u8 (*perused)(u8); //内存使用率
u8 *membase[SRAMBANK]; //内存池 管理SRAMBANK个区域的内存
u16 *memmap[SRAMBANK]; //内存管理状态表
u8 memrdy[SRAMBANK]; //内存管理是否就绪
};
extern struct _m_mallco_dev mallco_dev;//在mallco.c里面定义
nit,函数指针,指向内存初始化函数,用于初始化内存管理,带一个参数(Mini板不带)
,表示要初始化的内存片。
perused,函数指针,指向内存使用率函数,用于获取内存使用率,,带一个参数(Mini板不带),表示要获取内存使用率的内存片。
membase,内存池指针,指向内存池。最多有SRAMBANK个内存池(Mini板仅一个)。
memmap,内存管理表指针,指向内存管理表。最多有SRAMBANK个内存管理表(Mini板仅一个)。该指针为16位类型,因此,最大可以分配65535(可申请的

内存块数)内存块这么大的内存区域。
假定内存块大小为32字节,那么一次性最大可以申请的内存就是2M-32字节。
memrdy,内存管理表就绪标志,用于表示内存管理表是否已经初始化(清零)。最多有
SRAMBANK个内存管理表就绪标志(Mini板仅一个)。
(7)
这里写图片描述
这里写图片描述
内存中几个概念,1 内存块大小-一个内存块有多少个字节,2 内存表大小–有多少个内存表(一个内存块对应一个内存表),3最大管理内存=内存表大小
内存块大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值