如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片

news2024/12/25 13:10:43

如何剪裁操作系统源码

本文面向的需求场景是,为缺乏标准库实现的处理器IP移植内存管理模块,即为裸片部署C标准库中的 malloc()free() 函数。

具体做法是——从操作系统的内存管理组件中剪裁出必要的源码,适配到目标处理器的开发环境(SDK/IDE/CMAKE工程子目录)中。

1 定需求——理解内存管理/堆管理

1.1 C标准库中的内存管理方案

C标准库提供了一组内存管理函数,用于在C程序中进行动态内存分配和释放操作。这些函数主要包括malloc、calloc、realloc和free。

malloc函数: malloc函数用于分配指定大小的内存块,并返回指向该内存块的指针。其函数原型为:

void* malloc(size_t size);

它接受一个参数size,表示需要分配的内存空间的大小(以字节为单位)。malloc函数在堆内存中分配了一块连续的内存,并返回指向该内存块起始地址的指针。

calloc函数: calloc函数也用于分配指定数量和大小的内存块,并返回指向该内存块的指针。与malloc不同的是,calloc会将分配的内存块中的每个字节都初始化为0。其函数原型为:

void* calloc(size_t num, size_t size);

num参数表示需要分配的元素个数,而size参数表示每个元素的大小(以字节为单位)。calloc函数在堆内存中分配了大小为num * size的内存块,并返回指向该内存块起始地址的指针。

realloc函数: realloc函数用于调整先前分配的内存块的大小。其函数原型为:

void* realloc(void* ptr, size_t size);

ptr参数是指向先前通过malloc或calloc分配的内存块的指针,而size参数表示需要调整的大小(以字节为单位)。realloc函数根据新的大小重新分配内存块,并返回指向重新分配后内存块起始地址的指针。如果内存块不能被重新分配,realloc函数可能会创建新的内存块,并将原内存块的数据复制到新内存块中。

free函数: free函数用于释放先前通过malloc、calloc或realloc函数分配的内存块。其函数原型为:

void free(void* ptr);

ptr参数是指向先前分配的内存块的指针。通过调用free函数,该内存块将被标记为空闲,并可以被再次分配给其他内存需求。

1.2 需求剪裁

裸片程序受限于内存资源,一般是使用静态分配方法设计得到的,只在移植某些外设的驱动时需要提供基本的动态内存管理方法,很少有新增预分配的动态内存的需求。所以 realloccalloc 函数可以略去,这样咱的任务量就减少了一半啦。

2 找轮子——向操作系统学习

操作系统是对硬件的抽象,裸片上的绝大部分需求都可以在操作系统的源码中找到较为通用的实现,那么何必再造轮子呢,直接逮着操作系统的薅羊毛吧。

2.1 FreeRTOS中的内存管理方案

FreeRTOS 提供了几种堆管理方案,这些方案的复杂性和功能各不相同,分别适用于不同的需求场景,具体见下图。
在这里插入图片描述
总结性地说,FreeRTOS在源码目录 Source/Portable/MemMang 中为咱们提供了 5 种可选的内存管理模块的实现:

  • heap_1:极简版,不支持内存释放(没有 free 函数)
  • heap_2:支持释放,但不合并释放的内存块
  • heap_3:支持线程安全的 malloc 和 free 函数
  • heap_4:合并释放的内存块,避免内存碎片
  • heap_5:在 4 的基础上支持跨多个内存块进行分配

这儿咱们根据自己的需求选,本文选择 heap_2 移植,因为基本功能全面,且足够简单。

2.2 拉取源码

在源码树中找到 Source/Portable/MemMang/heap2.c,如下图。
在这里插入图片描述
打开就看到分配和释放函数触手可及,分别命名为 pvPortMallocvPortFree, 添加到咱的工程里,然后细看这个源文件的依赖,把依赖项从源码树里抠出来,舍弃不需要的文件,也就把内存管理模块从操作系统中剥离出来了。

2.3 剥离依赖项

heap_2.c包含了两个FreeRTOS相关的头文件—— FreeRTOS.h 和 task.h,后者是任务调度器相关的声明,咱们显然不需要,直接剔除。FreeRTOS是一些配置项的宏定义,咱们把与内存管理相关的剪切过来,不需要保留FreeRTOS.h整个文件。

在这里插入图片描述

然后是一个用于让管理的内存空间大小符合内存对齐需求的宏定义:

/* A few bytes might be lost to byte aligning the heap start address. */
#define configADJUSTED_HEAP_SIZE    ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT )

configTOTAL_HEAP_SIZE 和 portBYTE_ALIGNMENT 都需要我们手动 #define
在这里插入图片描述
heap_2.c 还用到一个宏定义 portBYTE_ALIGNMENT_MASK
在这里插入图片描述
原先在FreeRTOS.h里,我们加到portmacro.h里:
在这里插入图片描述
剩下的就是一些基本的类型替换了,我们统一放到 portmacro.h 文件中:
在这里插入图片描述
projdefs.h 也是需要的,里面有 truefalse 的宏:
在这里插入图片描述

2.4 可用源码

Github仓库:memManPort

3 测试

可以用下面这个demo来测试移植结果的可用性,只要pb和pc值结果一致,那就基本正确了。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/853476.html

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

相关文章

苹果电脑图像元数据编辑器:MetaImage for Mac

MetaImage for Mac是一款功能强大的照片元数据编辑器,它可以帮助用户编辑并管理照片的元数据信息,包括基本信息和扩展信息。用户可以根据需要进行批量处理,方便快捷地管理大量照片。 MetaImage for Mac还提供了多种导入和导出格式&#xff0…

Mysql下载及其安装的详细步骤

1.下载压缩包 官网地址:www.mysql.com 2.环境配置 1.先解压压缩包 2.配置环境变量 添加环境变量:我的电脑--->属性-->高级-->环境变量-->系统变量-->path 3.在mysql安装目录下新建my.ini文件并,编辑my.ini文件 编辑内容如…

最强chatgpt写论文,开源人人可用

大语言模型发展日新月异,有了LLM加持,GPT Researcher已经能帮你写论文了。 GPT Researcher 是一个自主代理程序,旨在进行多种任务的全面在线研究。 该代理能够生成详细、事实性和公正的研究报告,并提供个性化选项,以便…

“黑化”的AI | 盘点十大新型 AI 网络攻击类型

如今,人工智能技术的迅猛发展给各个领域都带来了前所未有的变革和进步。其中当属2023年上半年的“顶流选手”——生成式AI和ChatGPT了。 ChatGPT的火爆出圈,让人们看到了AI惊艳表现的光彩一面,但同时黑暗的一面也正在暗自发力,野…

windows11无故自动重启故障排查

引言 目前使用的windows 11版本是 Windows11家庭中文版 22H2,由于电脑放在工位需要跑模型,所以默认是长开的状态。但是最近来到工位总是发现电脑莫名其妙的自动重启。一开始以为是实验室断电的缘故,后来发现周围人的电脑都是正常运行状态&…

菲律宾的区块链和NFT市场调研

菲律宾的区块链和NFT市场调研 基本介绍 参考: https://zh.wikipedia.org/wiki/%E8%8F%B2%E5%BE%8B%E5%AE%BE zheng治制度:Zongtong议会制 现任Zongtong: 小费迪南德马科斯, 是独裁者费迪南德马科斯之子,人称“小马科斯” 官方语言…

【数据结构与算法】Vue3实现选择排序动画效果与原理拆解

系列文章目录 删除有序数组中的重复项 JavaScript实现选择排序 文章目录 系列文章目录1、选择排序的原理1.1、选择排序的基本步骤1.2、拆解思路 2、动画演示原理3、代码实现4、优化后的选择排序5、用Vue3实现选择排序的动画效果(第二部分的动画效果图) …

CS 144 Lab Six -- building an IP router

CS 144 Lab Six -- building an IP router 引言路由器的实现测试 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab Six 对应的PDF: Lab Checkpoint 5: building an IP router 引言 在本实验中,你将在现有的NetworkInterface基础上实现一个IP路由器&#xf…

整数线性规划——pulp指南

整数线性规划——pulp指南 PuLP是一个用Python编写的线性规划建模工具。PuLP可以生成MPS或LP文件,并调用GLPK、COIN-OR CLP/CBC、CPLEX、GUROBI、MOSEK、XPRESS、CHOCO、MIPCL、HiGHS、SCIP/FSCIP等求解线性问题。 官方文档地址:https://coin-or.githu…

【ROS】message_filters时间同步

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍message_filters时间同步。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷…

接口mock常用工具

在进行测试时,我们经常需要模拟接口数据,尤其是在前后端分离项目的开发中,在后端未完成开发时,前端拿不到后端的数据,就需要对后端返回的数据进行模拟。 如下一些工具,可以完成接口的mock。 Yapi 首先添…

算法通关村——轻松搞定两树相等问题

题目 给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为他们是相同的。 示例 输入:p[1,2,3] q[1,2,3] 输出:true 如下图所示: 输入&am…

制造执行系统(MES):优化生产管理的关键

制造业是现代经济的重要组成部分,随着技术的发展和市场需求的变化,制造企业面临着越来越大的挑战。为了在竞争激烈的市场中保持竞争力,企业需要实现生产过程的高效管理和优化。这就引入了制造执行系统(MES)&#xff0c…

【Spring Boot】了解Spring Boot 的日志文件

目录 一、日志的作用 二、日志文件的简单使用 1、Spring Boot中的默认日志 2、自定义日志打印 三、日志级别 1、日志级别分类 2、日志级别的设置 3、日志持久化 四、基于LomBok的日志输出 1、安装Lombok插件 2、使用Lombok添加日志 3、使用Lombok添加getter和setter…

第48节:cesium 面交集计算(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><vc-navigation

13-把矩阵看作是对系统的描述

探索矩阵乘法&#xff1a;更深刻的理解与应用视角 &#x1f9e9;&#x1f50d; 引言 &#x1f4d6; 在我们进一步探讨矩阵乘法之前&#xff0c;让我们从不同的角度来理解什么是矩阵&#xff0c;以及如何将矩阵视为一个系统。我们之前已经介绍了矩阵的基本概念和运算&#xff…

那些没人教你的Jmeter 循环断言,百度不到的,收藏一下吧

前言 对于使用jmeter工具完成接口测试的测试工程师而言。在工作中&#xff0c;或者在面试中&#xff0c;都会遇到一个问题。 CSV文档做了一大笔测试数据后&#xff0c;怎么去校验这个结果呢&#xff1f; 现在大部分测试工程师可能都是通过人工的方法去查看结果&#xff0c;十几…

【3D卡片切换】基于jquery实现3D堆叠卡片切换效果(附完整源码)

文章目录 写在前面涉及知识点实现效果1、搭建页面1.1 创建ul li节点1.2 丰富元素Html代码所示CSS代码所示 2、JS实现堆叠切换3、源码分享3.1 百度网盘3.2 123云盘3.3 邮箱留言 总结 写在前面 其实3D卡片堆叠切换效果&#xff0c;从我入前端坑以来就一直喜欢的一种轮播效果&…

护网行动 | AD360 在网络安全中的重要作用

随着数字化时代的来临&#xff0c;网络已经成为了人们生活和工作中不可或缺的一部分。然而&#xff0c;随之而来的是网络安全问题日益突出。为了应对这些安全威胁&#xff0c;护网行动应运而生&#xff0c;其中AD360在保障网络安全方面扮演着至关重要的角色。 AD360是一个集成的…

封装上传组件(axios,进度条onUploadProgress,取消请求)

目录 定时模拟进度条 方法 A.axios B.xhr 取消请求​​​​​​​cancelToken A.axios.canceltoken B.source对象创建canceltoken 完整代码 A.自定义上传组件 B.二次封装组件 情况 增加cancelToken不生效&#xff0c;刷新页面 进度条太快->设置浏览器网速 定时…