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

前言

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习笔记-2

文章目录 一、Linear model二、How to represent this function三、Function with unknown parameter四、ReLU总结、A fancy name 一、Linear model 线性模型过于简单,有很大限制,我们需要更多复杂模式 蓝色是线性模型,线性模型无法去表示…

如何匿名浏览网站,保护在线隐私?

在现如今的网络世界,在线隐私已不复存在。你总是被跟踪,即使你使用隐身模式也无济于事。隐身模式会阻止浏览器保存你的浏览历史记录。但它并不能阻止你的互联网服务提供商 (ISP)、雇主、学校、图书馆或你访问的网站看到你在网上做什么。 更有不法分子在未…

Lumerical学习——资源管理和运行模拟

一、资源管理(Resource Manager) 在模拟计算前必须对计算资源进行配置。采用资源管理器可以完成这项任务。单击主工具条的“资源(Resources)”按钮(见上图)就可以打开资源管理器。通常每个计算机只需设置一…

大型生物制药企业如何实现安全又高效地跨网域数据传输?

大型生物制药企业由于组织结构庞大、业务覆盖研发、生产及销售,因此内部会再细分为多个管理单位,包括研发部门、生产部门、质量控制部门、供应链管理部门及营销部和日常业务支撑部门等。在物理区域划分上,大型生物制药企业会设立实验室、研发…

摇人摇人, JD内推岗位(社招+校招)

摇人摇人, 有找工作的家人们看过来啊~ 虚位以待, 快到碗里来 算法开发工程师岗 京东云 北京|T7, 5-10年 岗位职责: 参与基于RAG知识库平台和ChatBI产品打造和商业化落地,进行相关技术:包括OCR、文档拆分、意图理解、多轮对话、NL2SQL、Embed…

mysql用户管理(user表列信息介绍,本质,管理操作),数据库的权限管理(权限列表,权限操作)

目录 用户管理 介绍 user表 介绍 列信息 Host User *_priv authentication_string 用户管理的本质 操作 创建用户 删除用户 修改用户信息 修改密码 自己修改 root用户修改指定用户的密码 数据库的权限 权限列表 给用户授权 查看权限 回收权限 刷新权限 …

Linux性能调优,还可以从这些方面入手

linux是目前最常用的操作系统,下面是一些常见的 Linux 系统调优技巧,在进行系统调优时,需要根据具体的系统负载和应用需求进行调整,并进行充分的测试和监控,以确保系统的稳定性和性能。同时,调优过程中要谨…

万界星空科技:智能称重打标系统

万界星空科技的称重系统是其为制造业,特别是线缆、漆包线、食品等行业提供的重要解决方案之一。以下是对该系统的详细介绍: 一、系统概述 万界星空科技称重系统是集成在其MES(制造执行系统)中的一个功能模块,专门用于…

基于springboot实习管理系统

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的,前后端分离。 开发语言:Java数据库:MySQL技术:…

React Agent 自定义实现

目录 背景 langchin 中的 agent langchin 中 agent 的问题 langchain 的 agent 案例 自定义 React Agent 大模型 工具定义 问题设定 问题改写,挖掘潜在意图 React Prompt 下一步规划 问题总结 代码 背景 之前使用过 langchian 中的 agent 去实现过一些…

2020年计算机网络408真题解析

第一题: 解析:OSI参考模型网络协议的三要素 网络协议的三要素:语法 ,语义,同步(时序) 语法:定义收发双方所交换信息的格式 语法:定义收发双方所要完成的操作 网页的加载 …

深入理解队列(Queue)的实现(纯小白进)

目录: 前言一、 什么是队列?1.1、 队列的特性1.2、 队列的图解 二、 队列的详细实现2.1、 队列不同的实现方式2.2、 队列结构体2.3、 队列的初始化2.4、 入队列2.5、 出队列2.6、 获取对头元素2.7、 获取队尾元素2.8、 队列的判空2.9、 队列有效的元素个数2.10、 队…

Kind部署的K8s证书过期后的解决方案

证书通常有效期为1年,一年后服务将不可用解决方案就是更新证书 1. 找到 Kind 集群的控制平面容器名称,容器名称不一定是这个 docker ps --filter "namekind-control-plane"2. 进入 Kind 控制平面的容器: docker exec -it kind-control-plane…

洛谷入门刷题Day5(想刷水题结果被水题刷了)

P1304 哥德巴赫猜想 题目描述 输入一个偶数 N N N,验证 4 ∼ N 4\sim N 4∼N 所有偶数是否符合哥德巴赫猜想:任一大于 2 2 2 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 10 10…

论文笔记:Ontology-enhanced Prompt-tuning for Few-shot Learning

论文来源:WWW 2022 论文地址:https://arxiv.org/pdf/2201.11332.pdfhttps://arxiv.org/pdf/2201.11332.pdf 论文代码:暂未公开 笔记仅供参考,撰写不易,请勿恶意转载抄袭! Abstract 小样本学习旨在基于…

Linux——传输层协议

目录 一再谈端口号 1端口号范围划分 2两个问题 3理解进程与端口号的关系 二UDP协议 1格式 2特点 3进一步理解 3.1关于UDP报头 3.2关于报文 4基于UDP的应用层协议 三TCP协议 1格式 2TCP基本通信 2.1关于可靠性 2.2TCP通信模式 3超时重传 4连接管理 4.1建立…

数据挖掘学习笔记:朴素贝叶斯 | Python复现

数据挖掘学习笔记:朴素贝叶斯 机器学习系列(四):朴素贝叶斯(华强买瓜版) - yyxy的文章 - 知乎 十分钟,让你再也忘不掉贝叶斯分类 - VoidHaruhi的文章 - 知乎 《机器学习》(西瓜书&am…

基于Arduino的简易收音机

DIY FM收音机:使用Arduino和Si4703模块打造 引言 在本项目中,我们将使用Arduino Nano和Si4703 FM调谐模块来构建一个功能完备的FM收音机接收器。这个易于跟随的指南非常适合想要深入无线电频率和无线通信世界的业余爱好者和电子爱好者。 Si4703模块是…

说下SSL/TLS四次握手过程?

参考自:SSL/TLS四次握手过程是怎么样的?HTTPS、SSL、TLS三者之间的联系和区别 一.SSL/TLS 简介 SSL(Secure Socket Layer 安全套接层)是基于 HTTPS 下的一个协议加密层,用于解决 HTTP 在传输数据时使用明文而导致的不安全问题。 SSL 是 HT…

cuda编程模型

host和device: host:即CPU,CPU所关联的内存就叫host memorydevice:即GPU,GPU内的内存就叫device memory运行CUDA程序主要有三步:1)host-to-device transfer:将数据从host memory拷到…