400行程序写一个实时操作系统(九):替换FreeRTOS的内存管理算法

发布于:2024-10-17 ⋅ 阅读:(7) ⋅ 点赞:(0)

前言

通过前面几章,笔者带领大家完成了内存管理算法的编写。

我们完成的内存管理算法,被称为小内存管理算法。我们也可以将它作为一个库,在后续的嵌入式开发中,使用我们自己编写的malloc,不仅效率会更高,而且也便于自己修改。

小内存管理算法在各种RTOS中被广泛应用

其实读者如果对FreeRTOS的内存管理的源码有过研究,就会发现Sparrow和FreeRTOS heap4.c文件的算法几乎是一样的,都是小内存管理算法,当然,不止FreeRTOS,RT-Thread的内存管理也采用了小内存管理算法,也就是先定义一个大内存块,当需要分配内存块时,就从大内存块中分割对应的内存。

这些小内存管理算法的精髓在于对碎片化内存的合并,内存碎片化是一个很有趣的话题。根据笔者的经验,如果编写的程序在运行了很长时间后宕机了,那么多半是内存碎片化的问题。

自己编写内存管理算法更有利于我们对其他操作系统的内存管理的理解

从小小的Sparrow,到FreeRTOS,RT-Thread,一路到linux。内存管理无处不在,虽然操作系统的复杂程度的不同,但是内存管理算法的核心思想是一样的,都是为了更合理的内存分配,减少内存碎片的产生,从而提高内存的使用率。

验证我们的内存管理算法

在我们写好程序并且调试也发现没有什么大问题后,为了验证我们自己编写的内存管理算法的稳定性,笔者将会带领大家做一个小实验。

我们将会在移植好FreeRTOS的工程中替换heap4.c中的程序,改用我们自己编写的程序,通过观察FreeRTOS是否能稳定运行来判断我们的内存管理算法是否有问题。

替换

读者可以从我的github:skaiui2/SKRTOS_sparrow at memory (github.com)

下载移植好FreeRTOS的hal库工程。

以防万一读者可以先编译运行,下载到单片机后的现象是stm32f103c8t6最小系统板的灯在一闪一闪亮晶晶

然后找到heap4.c的位置:

直接ctrl A + delete将里面的所有代码删除,然后将我们写的内存管理算法的代码粘贴进去

粘贴后,找到heap_malloc函数,将它的命名修改为pvPortMalloc。

再找到heap_free函数,将它的命名修改为vPortFree:

点击编译按钮,编译提示成功:

添加图片注释,不超过 140 字(可选)

此时我们就可以把我们的程序下载进去看看现象,如果下载到单片机后的现象是stm32f103c8t6最小系统板的灯不闪烁了,说明我们编写的内存管理算法还有问题,需要再进行调试。

如果灯和未修改heap4.c文件之前的现象一样,都是在闪烁,说明我们的程序正常。

总结

文章开头简单说明了我们编写内存管理算法的意义,为了验证编写内存管理算法的稳定性,笔者带领大家在移植了FreeRTOS的工程中,将FreeRTOS的内存管理算法文件heap4.c的代码替换为我们自己编写的内存管理算法,然后编译下载移植后的程序,观察单片机的现象,验证我们自己编写的内存管理算法的正确性。

当看到自己的程序在FreeRTOS中流畅地运行时,我相信读者的内心一定会有所触动。

本文所有文件我都放在了GitHub·:skaiui2/SKRTOS_sparrow at memory (github.com)