自编STM32轻量级操作系统(三)------内存管理

你好,这里是风筝的博客,

欢迎和我一起交流。


上一章 自编STM32轻量级操作系统(二)------任务调度 讲了内存调度算法,接下来说下内存管理。

其实我也没有什么好的内存管理算法,也是一种很大众、普通的算法,该有的内存碎片还是会有,而且STM32是支持标准库的,即支持malloc和free函数,所以写这个纯粹好玩。


好了,来看看我们的内存管理算法是怎么实现的吧:

 自编STM32轻量级操作系统(三)------内存管理

令人陶醉的图啊,完美的诠释了这一章的内容,简直可以就地下课了......

这图主要就是说,用一块小内存去管理一块大内存。

我们知道,一块内存,其实可以看成一大块数组,申请一块大数组,这就是我们的内存池了,那么怎么管理呢?再申请一块小数组,用来做内存管理表。

这样,内存管理表中的一个字节,管理内存池中的八个字节。为什么是八个呢?当然是为了八字节对齐拉。

内存管理表中,0代码内存空闲,否则代表占用。

比如:

假设内容池里内存只有前八个字节(0x00到0x07)被占用了,其他全部是空闲的,可被申请的。即内存管理表中第一个自己被置为1,其他为0。

当我们想在内存池中为指针P申请十六个字节时,先去访问内存管理表中,有哪些内存是可以被申请的:

因为内存管理表中的一个字节,管理内存池中的八个字节,所以申请十六个字节,只要找出内存管理表中连续为0的两项即可。显而易见,管理表中第二项和第三项是连续的两项为0,即代表0x08到0x23是可被申请的。所以申请内存时,只要把0x08这个地址返回回去即可(基地址+偏移量,0x00+偏移量*八字节)。然后再把刚刚分配出去的内存对应的管理表置为1,即把管理表中第二项、第三项置为1。

好了,指针P已经指向0x08这个地址了,但是释放呢,改怎么释放?

当然也是把内存管理表中对应的项置为0了,但是问题来了,我们只知道要释放的指针P指向的是0x08这个地址,对应管理表的第二项,那么,问题来了,除了第二项,我们还要把哪些项设为0?

懵逼了吧。。。。。。

所以,我们申请内存时,不能单纯的把内存管理表置为1,应该包含一个基本的信息:本次申请了多大字节!!

所以应该在申请时,第二项不能单纯的置为1,应该之位2,代表从这个位置开始,有两项(即2*8个字节)被占用了,所以释放时,直接把这两项置为0即可。


最后,上程序咯:

自编STM32轻量级操作系统(三)------内存管理

定义一些变量,内存池和管理表。这里我定义的10K的内存池。


自编STM32轻量级操作系统(三)------内存管理

内存管理表初始化,要把管理表的的项都置为0,一块纯洁的内存。。。。。。


自编STM32轻量级操作系统(三)------内存管理

申请内存函数,这是一个指针函数,void * 百搭哦 。内存申请成功会返回一个可用的地址,失败则会返回0x00000000L。


最后就是内存释放了:

自编STM32轻量级操作系统(三)------内存管理

释放就比较简单了,直接把内存管理表中的数据请零即可。

这里注意哦,释放了内存,千万不要再去用这个指针哟,不然会产生不可预料的后果。


最后,我把程序也放在了上一章的例程里,有兴趣的自行下载哟~


下一章:自编STM32轻量级操作系统(四)------信号量的实现