FreeRTOS操作系统学习——内存管理

news2024/11/20 0:32:51

C库函数与FreeRTOS内存管理区别

在C语言的库函数中,有mallc、free等函数可以申请以及释放内存空间,那么这为什么不适用于FreeRTOS的内存管理呢?

  • 不适合用在资源紧缺的嵌入式系统中
  • 这些函数的实现过于复杂、占据的代码空间太大
  • 并非线程安全的(thread-safe)
  • 运行有不确定性:每次调用这些函数时花费的时间可能都不相同
  • 内存碎片化
  • 使用不同的编译器时,需要进行复杂的配置
  • 有时候难以调试

FreeRTOS内存管理

FreeRTOS内存管理方式主要依靠堆和栈来实现

  • 堆,heap,就是一块空闲的内存,需要提供管理函数
    • malloc:从堆里划出一块空间给程序使用
    • free:用完后,再把它标记为"空闲"的,可以再次使用
  • 栈,stack,函数调用时局部变量保存在栈中,当前程序的环境也是保存在栈中
    • 可以从堆中分配一块空间用作栈
      在这里插入图片描述

FreeRTOS内存管理方法比较

Heap_1

它只实现了pvPortMalloc,没有实现vPortFree。
如果你的程序不需要删除内核对象,那么可以使用heap_1
⚫ 实现最简单,在定义好的一个大数组中分配内存
⚫ 没有碎片问题
⚫ 一些要求非常严格的系统里,不允许使用动态内存,就可以使用heap_1
在这里插入图片描述

Heap_2

Heap_2之所以还保留,只是为了兼容以前的代码。新设计中不再推荐使用Heap_2。建议使用Heap_4来替代Heap_2,更加高效。 Heap_2也是在数组上分配内存,跟Heap_1不一样的地方在于:
⚫ Heap_2使用最佳匹配算法(best fit)来分配内存
⚫ 它支持vPortFree
⚫最佳匹配算法: 假设heap有3块空闲内存:5字节、25字节、100字节。pvPortMalloc 想申请20字节,找出最小的、能满足pvPortMalloc的内存:25字节 把它划分为20字节、5字节。返回这20字节的地址,剩下的5字节仍然是空闲状态,留给后续的pvPortMalloc使用 。
在这里插入图片描述
缺点:
在这里插入图片描述

Heap_3

在这里插入图片描述

Heap_4

跟Heap_1、Heap_2一样,Heap_4也是使用大数组来分配内存。 Heap_4使用首次适应算法(first
fit)来分配内存。它还会把相邻的空闲内存合并为一个更大的空闲内存,这有助于较少内存的碎片问题。

首次适应算法:
⚫ 假设堆中有3块空闲内存:5字节、200字节、100字节
⚫ pvPortMalloc 想申请20字节
⚫ 找出第1个能满足pvPortMalloc的内存:200字节
⚫ 把它划分为20字节、180字节
⚫ 返回这20字节的地址
⚫ 剩下的180字节仍然是空闲状态,留给后续的pvPortMalloc使用
在这里插入图片描述
在这里插入图片描述

Heap_5

Heap_5 分配内存、释放内存的算法跟Heap_4是一样的。 相比于Heap_4,Heap_5并不局限于管理一个大数组:它可以管理多块、分隔开的内存。 在嵌入式系统中,内存的地址可能并不连续,这种场景下可以使用Heap_5。既然内存时分隔开的,那么就需要进行初始化:确定这些内存块在哪、多大。

指定内存方法,使用结构体。

typedef struct HeapRegion 
{ 
uint8_t * pucStartAddress; // 起始地址 
size_t xSizeInBytes;       // 大小 
} HeapRegion_t; 

指定多块内存方法

 HeapRegion_t xHeapRegions[] = 
{ 
{ ( uint8_t * ) 0x80000000UL, 0x10000 }, // 起始地址0x80000000,大小0x10000 
{ ( uint8_t * ) 0x90000000UL, 0xa0000 }, // 起始地址0x90000000,大小0xa0000 
{ NULL, 0 } // 表示数组结束 
};

初始化内存

void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ); 

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

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

相关文章

软考59-上午题-【数据库】-小结+杂题

一、杂题 真题1: 真题2: 真题3: 真题4: 真题5: 真题6: 真题7: 真题8: 二、数据库总结 考试题型: 1、选择题(6题,6分) 2、综合分析题…

LeetCode 热题 100 (尽量ACM模式刷) 持续更新!!!

LeetCode 热题 100 哈希hash 1 两数之和 /** 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。* 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案…

Claude3登顶榜首,上亚马逊云科技快人一步体验!

AI大模型春秋争霸已经进入了新的赛季,2024年3月4日,在一夜之间,Anthropic Claude 3提前"阻击"GPT-5 **Claude 3 在数学问题、编程练习和科学推理等标准化评估方面超越了现有模型。**客户可以使用人工智能驱动的响应,以自…

ZYNQ--关于一些SDK调试问题记录

Debug configuaration中没有debug applicaton 问题如下图: 解决方法: 在Target Setup中的Debug Type中选择如下即可 注意选完之后application中必须勾选运行内核,否则不运行main文件。

可以设置提醒的电脑桌面便签备忘录软件哪个好用?

对于我们职场人来说,每天的时间都很紧张且有价值,如何有效地利用它们,让时间不被浪费流逝掉,成为越来越多的人在思考的一个问题。为了有效管理时间以及各项待办事务,一些人会使用可以设置提醒的电脑桌面便签备忘录软件…

docker-compose一键离线部署系统流程

【金山文档】 未命名文件(34)https://kdocs.cn/l/cjmzJrQMhdCS

Ubuntu下安装Scala

前言 弄了一下终于成功装上了,这里对此进行一下总结 安装虚拟机 VMware虚拟机安装Ubuntu(超详细图文教程)_vmware安装ubuntu-CSDN博客https://blog.csdn.net/qq_43374681/article/details/129248167Download Ubuntu Desktop | Download | …

【Leetcode每日一题】 前缀和 - 寻找数组的中心下标(难度⭐)(28)

1. 题目解析 题目链接:724. 寻找数组的中心下标 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 核心在于计算题目所给数组是否存在某一个元素左边的和等于右边的和,存在返回那个元素下标即可,不…

springboot,druid动态数据源切换

关键字:springboot,druid数据库连接池,两个数据源(可以切换成多个),事务管理 关于druid简介传送门:https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 具体分为四…

Linux进程详细介绍

文章目录 Linux进程1、计算机体系结构和操作系统管理1.1、计算机体系结构 -- 硬件1.2、操作系统(Operator System) -- 软件 2、进程2.1、进程基本概念2.2、进程标识符2.2.1、获取当前进程标识符和当前进程的父进程标识符2.2.2、通过系统调用创建进程 -- …

FIFO漫谈

文章目录 目录 概要 整体架构流程 技术名词解释 技术细节 为什么需要FIFO? 小结 概要 FIFO,全称为First-In, First-Out,意为先进先出。它就像是一个排队买东西的队伍,第一个进入队伍的人会第一个离开队伍。在芯片中,F…

概要了解postman、jmeter 、loadRunner

postman还蛮好理解的,后续复习的话着重学习关联接口测试即可,感觉只要用几次就会记住: 1 从接口的响应结果当中提取需要的数据 2 设置成环境变量/全局变量(json value check 、set environment para 3写入到下一个接口的请求数据中…

GIS软件应用(一)

任务: 1.加载南京市边界数据、查看投影坐标系并完成投影转换 2.加载科教文卫POI数据、查看投影坐标系并完成投影转换 3.出图要求添加完整出图要素 步骤: 选中shp文件,加载南京市边界数据 在ArcToolbox工具箱中选中Projections and Transf…

idea内置的database和chat2DB如何?

捉妖啦 最近由于某些众所周知的因素,要求卸载navicat,所以寻找替代品是当下任务。如果知识MySQL数据库的话,那替代品可太多了,由于使用的是MongoDB,所以至今没有找到一个称手的工具。 需要一款像Navicat一样,可以直…

MySQL性能优化-范式设计和反范式设计

范式化设计 范式化设计背景 范式是数据表设计的基本原则,又很容易被忽略。很多时候,当数据库运行了一段时间之后,我们才发现数据表设计得有问题。重新调整数据表的结构,就需要做数据迁移,还有可能影响程序的业务逻辑…

【WPS】Excel查重数据对比

数据对比 数据对比标记重复数据查询过滤处理

C++基于多设计模式下的同步异步日志系统day1

C基于多设计模式下的同步&异步日志系统day1 📟作者主页:慢热的陕西人 🌴专栏链接:C基于多设计模式下的同步&异步日志系统 📣欢迎各位大佬👍点赞🔥关注🚓收藏,&am…

Windows安装tdm-gcc(详细图文)

目录 一、tdm-gcc的下载地址 二、安装tdm-gcc 1.双击下载的tdm-gcc 2.点击create 下载 3.下载完成之后,点击第二个,再点击next。 4.更换安装目录 5. 全部勾选,点击install 三、配置系统环境变量 四、验证TDM-GCC 一、tdm-gcc的下载地…

O2O:Offline–Online Actor–Critic

IEEE TAI 2024 paper 1 Introduction 一篇offline to online 的文章,有效解决迁移过程出现的performance drop。所提出的O2AC算法首先在离线阶段添加一项BC惩罚项,用于限制策略靠近专家策略;而在在线微调阶段,通过动态调整BC的权…

鸿蒙全栈开发必学!码牛课堂《HarmonyOS NEXT星河版零基础入门到实战教程》,学到就是赚到!

众所周知,码牛发布的免费教程不仅质量高,而且更新快,帮助无数大学生成功踏入IT行业,被同学们亲切的称为“IT启蒙导师”。 今年被称为鸿蒙元年,各行业急缺鸿蒙相关人才,从招聘情况来看,鸿蒙人才…