单片机内存管理器第三版

本文介绍了作者编写的第三版单片机内存管理器,采用了分组和分页策略来解决内存碎片问题。内存管理器由总管理器和各分页管理器组成,空闲内存页以单向链表管理。虽然内存使用率不高,但具有无碎片、快速分配和释放等优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是个人编写的第三版内存管理器,主要用在单片机上。这一系列的内存管理器,由于本人对内存碎片的执念,于是前两版的使用非常反人类。举个例子:

第一版

void** malloc(uint32_t _size,uint8 _userid);

分配出来的是指向地址的地址,这对常规程序来说,用起来的感觉是相当酸爽。

第二版

void* malloc(uint32_t _size,uint8_t _userid,void **_address);

这就比较好看点了,但是还要给一个被分配的指针变量的地址。(内存管理第二版)

上面两个版本,用的一种思路是——知道被分配的地址a的地址b,每当碎片整理时,直接将数据移动到上一块被使用的内存后面,更新地址b上的地址a,得到地址c。
碎片整理前

类型 内存块1 内存块2 内存块3 内存块4 内存块5 内存块6
数据 hello world !!!
内存池地址 0x40000000 0x40000010 0x40000020 0x40000030 0x40000040 0x40000050
被分配的地址 0x20001024 0x20003280 0x20007238

碎片整理后

类型 内存块1 内存块2 内存块3 内存块4 内存块5 内存块6
数据 hello world !!!
内存池地址 0x40000000 0x40000010 0x40000020 0x40000030 0x40000040 0x40000050
被分配的地址 0x20001024 0x20003280 0x20007238

将内存块 0x40000020 上的数据 “world” 复制到 内存块 0x40000010 上,并将新的地址更新到指针变量地址 0x20003280 上。
像这样做的优点是,当碎片整理完成后,不影响数据的使用。而缺点是,只能自己玩,并不适合一起用。

但是在某一天,翻资料,看到了linux的内存管理机制后,一下顿悟了,于是有了内存管理器的第三版。


原理

(n块内存组成一页,n页内存组成一组,n组内存)
1. 根据设定的内存大小(不超过物理内存)即内存池,分配 x 组(目前x最大值为1024),根据分配策略限定每组内存大小。
2. 按照 2i,i[0,x] 2 i , i ∈ [ 0 , x ] 的规律,对 i,i[0,x] i , i ∈ [ 0 , x ] 组进行分页。
3. 内存分配顺序,由小页到大页,游大端到大端。
4. 当要分配的

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值