1.什么是内存管理
内存管理,是指软件运行时对MCU内存资源的分配和使用的技术。
其最主要目的是:如何高效,快速的分配,并且在适当的时候释放和回收内存资源。
内存使用三部曲:
(1)内存申请(分配) (malloc函数用于内存申请)
(2)内存使用
(3)内存释放 (free函数用于内存释放)
2. 分块式内存管理
2.1 基本概念
分块式内存管理由内存池和内存管理表两部分组成。 内存池被等分为n块,对应的内存管理表,大小也为n,内存管理表的每一个项对应内存池的一块内存。
内存管理表的项值代表的意义:当该项值为0的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。
比如某项值为 10,那么说明包括本项对应的内存块在内,总共分配了 10个内存块给外部的某
个指针。
内存分配方向如上图所示,是从顶→底的分配方向。即首先从最末端开始找空内存。当内
存管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用。
2.2 分配原理
当指针p调用malloc申请内存时
-
先判断p要分配的内存块数(m)
-
从第n项开始,向下查找,直到找到m块连续的空内存块(即对应内存管理表项为0)
-
将这m个内存管理表项的值都设置为m(标记被占用)
-
把最后的这个空内存块的地址返回指针p,完成一次分配
注意:如果当内存不够时(找到最后也没有找到连续m块空闲内存),则返回NULL给p,表示分配失败。
2.3 释放原理
当指针p申请的内存用完,需要释放的时候,调用free函数实现。
- 先判断p指向的内存地址所对应的内存块
- 找到对应的内存管理表项目,得到p所占用的内存块数目m
- 将这m个内存管理表项目的值都清零,标记释放,完成一次内存释放
2.4 分块内存管理需要的参数
- 内存池大小
- 内存块大小
- 内存块数 / 管理表项数目
- 管理表项大小
3. 内存管理使用
- 初始化内存 void my_mem_init(uint8_t memx)
- 申请内存 void *mymalloc(uint8_t memx, uint32_t size)
- 操作内存 sprintf((char *)p, "Memory Malloc Test %3d", i)
- 释放内存 void myfree(uint8_t memx, void *ptr)
内存管理控制器 struct _m_malloc_dev