单片机的动态内存管理——自己实现heap管理

本文介绍了作者如何在单片机上实现动态内存管理,通过创建一个固定大小内存块的数组,并自行管理分配与释放。malloc和free的实现思路被详细阐述,尽管存在碎片管理的问题,但作为1.0版本的基础,期待后续改进。
摘要由CSDN通过智能技术生成

两年前一位同事和我说过,单片机不能实现动态内存管理,两天后我在keil上利用malloc()在coterx m3芯片上实现了一个链表,然后把代码给他看了,对固执的人摆事实好过讲道理。

之后我觉得使用malloc()并不能满足我的需求,然后想自己实现一个heap管理。

这就是这篇文章的由来,这是我今天下午突然想到的一种简单的方法,其实这很没有意义,因为我能想到的东西,别人都已经做出来了。嗯,姑且当是一个编程题的实现吧。

数据结构很简单,就是先开辟一个大数组,然后将数组分割,每个块大小固定,我定义为16个字节,每个块用一个字节管理,然后记录下有几个块没有被使用。

malloc的实现,输入形参和malloc一样,就是内存需求大小,申请成功返回地址,不成功返回NULL。实现思想如下,先计算的出需要几个内存块,然后检测剩余内存块是否足够,如果足够,再检测是否连续,都满足的话,将第一个内存块的管理单元赋值1,第二个赋值2,以此类推。然后将剩余内存块数量减去使用掉的数量,返回地址。

free的实现,输入形参和free一样,就是malloc获得的地址,无返回。实现思想如下,先计算出地址相对heap起始地址的偏移,然后得出相应的内存管理单元,如果该内存管理单元为1,将该单元以下连续管理单元都清空,然后将剩余内存块加上相应的地址,返回。

这份代码算是1.0版本,没有dubug过,不建议使用。没有debug的原因是没有想到怎么实现碎片管理的办法,我想在2.0版本上面实现,这个姑且算是一份伪代码吧。如果谁有内存碎

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值