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

news/2024/10/17 10:52:51/

前言

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

我们完成的内存管理算法,被称为小内存管理算法。我们也可以将它作为一个库,在后续的嵌入式开发中,使用我们自己编写的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)


http://www.ppmy.cn/news/1539691.html

相关文章

目标检测系统中需要【重新训练模型】说明

上百种【基于YOLOv8/v10/v11的目标检测系统】目录(pythonpyside6界面系统源码可训练的数据集也完成的训练模型)-CSDN博客 目标检测系统操作说明【用户使用指南】(pythonpyside6界面系统源码可训练的数据集也完成的训练模型)-CSDN…

上海亚商投顾:沪指冲高回落 成渝板块近50股涨停

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天震荡分化,三大指数涨跌不一。成渝本地股集体爆发,成都路桥、重庆建工、四川金…

R语言绘制聚类热图

聚类热图是一种直观的数据可视化工具。它以矩形彩色图表的形式呈现数据矩阵,每个单元格颜色对应特定数值,通常从低值的冷色调到高值的暖色调渐变。常应用于多个领域,如生物学中分析基因表达、蛋白质相互作用和生物群落;金融领域用…

易基因:DNA甲基化+转录组综合分析鉴定调控猪睾丸发育的潜在基因|附经典研究思路

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 DNA甲基化在调控基因表达和睾丸发育中发挥重要作用。WGBS 和 RNA-Seq 数据综合分析可以绘制DNA甲基化与基因表达关系的全面图谱,从而鉴定受甲基化影响的关键基因。如对小鼠睾…

蓝桥杯刷题--幸运数字

幸运数字 题目: 解析: 我们由题目可以知道,某个进制的哈沙德数就是该数和各个位的和取整为0.然后一个幸运数字就是满足所有进制的哈沙德数之和.然后具体就是分为以下几个步骤 1. 我们先写一个方法,里面主要是用来判断,这个数在该进制下是否是哈沙德数 2. 我们在main方法里面调用…

【Flutter】Dart:类

在 Dart 中,类(Class)是面向对象编程的核心概念之一,提供了一种封装数据和功能的方式。理解 Dart 中的类以及它的相关特性是开发 Flutter 应用的基础。本教程将深入介绍 Dart 中类的定义、属性、构造函数、方法、接口、Mixin 以及…

Lumerical学习——分析工具(Analysis tools)

一、分析工具和模拟环境(Analysis tools and the simulation environment) 模拟计算完成后,模拟计算数据紧接着写到模拟工程文件中;甚至当模拟计算提前结束时计算得到的部分数据集也会写到文件中。当模拟完成后单击退出按钮、或者…

【深度学习 | 基础部分】深度学习导论

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…