当前位置: 首页 > news >正文

【STM32 FreeRTOS】内存管理

除了FreeRTOS提供的动态内存管理方法,标准的C库也提供了函数malloc()和函数free()来实现动态的申请和释放内存。

为啥不用标准的C库自带的内存管理算法?因为标准C库的动态管理方法有如下缺点:

  • 占用大量的代码空间,不适合用在资源紧缺的嵌入式系统中
  • 没有线程安全的相关机制
  • 运行有不确定性,每次调用这些函数时花费的时间可能都不相同
  • 内存碎片化

因此,FreeRTOS提供了多种动态内存管理的算法,可针对不同的嵌入式系统。

算法优点缺点
heap_1分配简单,时间确定只允许申请内存,不允许释放内存
heap_2允许申请和释放内存不能合并相邻的空闲内存块会产生碎片、时间不定
heap_3直接调用C库函数malloc和free,简单速度慢、时间不定
heap_4相邻空闲内存可合并,减少内存碎片的产生时间不定
heap_5能够管理多个非连续内存区域的heap_4时间不定

我们一般使用heap_4。heap_4内存管理算法使用了首次适应算法,也支持内存的申请和释放,并且能够将空间且相邻的内存进行合并,从而减少内存碎片的现象。

首次适应算法

假设heap有3块空闲内存(按内存块地址有底到高排序):5字节、50字节、25字节

现在新创建一个任务需要申请20字节的内存

第一步:找出第一个能满足pvPortMalloc的内存:50字节

第二步:把它划分为20字节、30字节;返回这20字节的地址,剩下的30字节仍然是空闲状态,留给后续的pvPortMalloc使用

heap_4内存管理算法会把相邻的空闲内存合并为一个更大的空闲内存,这有助于减少内存的碎片问题。

函数描述
void *pvPortMalloc( size_t xWantedSize )申请内存
void vPortFree( void *pv )释放内存
size_t xPortGetFreeHeapSize( void )获取当前空闲内存大小

关于内存,这里在多说几句:

裸机时我们会定义堆栈大小,例如**_Min_Heap_Size = 0x200**,_Min_Stack_Size = 0x400这个是在RAM中的。如果是使用标准C库的malloc函数,那么就会从这个堆中申请内存;如果是函数中的局部变量,那么就是申请的这里的栈内存。

FreeRTOS中也会定义一个堆空间ucHeap[ configTOTAL_HEAP_SIZE ],这个堆空间也是RAM的一部分,和裸机中的堆栈没有任何关系。这个堆空间用于FreeRTOS中API申请内存空间(例如动态创建任务,任务的堆栈空间),再或者pvPortMalloc函数动态申请内存。

相关文章:

【STM32 FreeRTOS】内存管理

除了FreeRTOS提供的动态内存管理方法,标准的C库也提供了函数malloc()和函数free()来实现动态的申请和释放内存。 为啥不用标准的C库自带的内存管理算法?因为标准C库的动态管理方法有如下缺点: 占用大量的代码空间,不适合用在资源…...

vue3+vite+cesium配置参考

在vite项目中使用Cesium的配置 关键: 资源目录的复制;CESIUM_BASE_URL的正确配置 //vite.config.js // ... // 安装打包复制资源插件,手动复制不需要 // npm i vite-plugin-static-copy import { viteStaticCopy } from vite-plugin-static-c…...

WEB应用服务器TOMCAT

知识点 一 、WEB技术 1、前端三大核心技术 1.1 HTML HTML ( HyperText Markup Language )超文本标记语言,它不同于一般的编程语言。超文本 即超出纯文本的范畴,例如:描述文本颜色、大小、字体等信息,或使…...

maven打包jar后运行提示“没有主清单属性”问题的几种解决方案

常用的几种maven项目打包后&#xff0c;jar运行提示“没有主清单属性”问题的解决方案&#xff0c;大部分都是要修改pom.xml文件&#xff0c;同时有几种自己常用的配置文件&#xff0c;主要供自用&#xff0c;勿喷。 第一种&#xff1a; <build><plugins><plug…...

计算机毕业设计选题推荐-民宿可视化分析-Python爬虫-随机森林算法

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

WKWebView加载项目中网页的资源图片路径异常

问题原因&#xff0c;将含有html的文件通过如下方式引入到工程中&#xff1a; 这种处理方式&#xff0c;当应用程序变以后&#xff0c;引入的文件会被全部放在Resources目录下&#xff0c;而忽略你原本的文件路径信息。因此导致出问题。 解决方案&#xff1a; 采用如下方式引…...

算法全面剖析

算法 查找算法&#xff1a; 顺序查找&#xff1a; 基本思想&#xff1a; 顺序查找也称为线形查找&#xff0c;属于无序查找算法。从数据结构线形表的一端开始&#xff0c;顺序扫描&#xff0c;依次将扫描到的结点关键字与给定值k相比较&#xff0c;若相等则表示查找成功&am…...

tp5php7.4配置sqlserver问题汇总

先修改database.php文件 查看php版本选择sqlserver扩展 通过百度网盘分享的文件&#xff1a;sqlserver 链接&#xff1a;https://pan.baidu.com/s/1zrIV8VWQZM9miLpyH01Aww?pwdxdgx 提取码&#xff1a;xdgx 通过我的分享链接复制自己需要的dll到php的ext下 在php.ini里添加扩…...

C语言随笔:字面量

字面量&#xff08;Literal&#xff09;是指程序源代码中直接写出的固定值。字面量用于表示数据常量&#xff0c;它们在程序编译时被直接解析并用于程序运行。 常见的字面量类型 整数字面量&#xff08;Integer Literals&#xff09; 描述&#xff1a;表示整数值。示例&#x…...

chainlit的基本概念聊天对话中的元素

文本消息是聊天机器人的组成部分&#xff0c;但我们通常希望向用户发送的不仅仅是文本&#xff0c;还包括图像、视频等。 这就是元素出现的地方。每个元素都是一段内容&#xff0c;可以附加到Message或Step 并显示在用户界面上。 chainlit支持的元素如下&#xff1a; 文本元…...

【LeetCode:3】无重复字符串的最长子串(Java)

题目链接 3. 无重复字符串的最长子串 题目描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: s “bbb…...

C#对字典使用Linq查询

Dictionary<int, int> dic new Dictionary<int, int>();dic.Add(1, 2);dic.Add(2, 3);dic.Add(3, 4);dic.Add(4, 5);dic.Add(5, 6);//筛选键var keys dic.Where(item > item.Key > 2).Select(item > item.Key);foreach (var item in keys){Console.Writ…...

【Vue】Vue基础

系列文章目录 第二章 Vue基础&#xff08;1&#xff09; 文章目录 系列文章目录第一节&#xff1a;Vue介绍一、Vue介绍二、Vue项目创建三、项目结构介绍 第二节&#xff1a;组合式API一、基本介绍二、setup介绍三、setup上指定组件名称 第三节&#xff1a;响应式变量一、使用r…...

贪心 + 分层图bfs,newcoder 76652/B

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 https://ac.nowcoder.com/acm/contest/76652/B 二、解题报告 1、思路分析…...

如何在Linux上部署Java Web应用程序

在Linux上部署Java Web应用程序是一个常见的任务&#xff0c;本文将介绍一种常用的方法&#xff0c;分为以下几个步骤&#xff1a; 准备服务器 首先&#xff0c;你需要准备一台运行Linux操作系统的服务器。你可以选择使用各种不同的Linux发行版&#xff0c;如Ubuntu、CentOS等…...

SpringBoot 整合 Excel 轻松实现数据自由导入导出

01、背景介绍 在实际的业务系统开发过程中&#xff0c;操作 Excel 实现数据的导入导出基本上是个非常常见的需求。 之前&#xff0c;我们有介绍一款非常好用的工具&#xff1a;EasyPoi&#xff0c;有读者提出在数据量大的情况下&#xff0c;EasyPoi 会占用内存大&#xff0c;…...

PyTorch 基础学习(13)- 混合精度训练

系列文章&#xff1a; 《PyTorch 基础学习》文章索引 基本概念 混合精度训练是深度学习中一种优化技术&#xff0c;旨在通过结合高精度&#xff08;torch.float32&#xff09;和低精度&#xff08;如 torch.float16 或 torch.bfloat16&#xff09;数据类型的优势&#xff0c;…...

Mycat分片-垂直拆分

目录 场景 配置 测试 全局表配置 续接上篇&#xff1a;MySQ分库分表与MyCat安装配置-CSDN博客 续接下篇&#xff1a;Mycat分片-水平拆分-CSDN博客 场景 在业务系统中, 涉及以下表结构 ,但是由于用户与订单每天都会产生大量的数据, 单台服务器的数据 存储及处理能力是有限…...

一元四次方程求解-【附MATLAB代码】

目录 前言 求解方法 ​编辑 MATLAB验证 附&#xff1a;一元四次方程的故事 前言 最近在研究机器人的干涉&#xff08;碰撞&#xff09;检测&#xff0c;遇到了一个问题&#xff0c;就是在求椭圆到原点的最短距离时&#xff0c;构建的方程是一个一元四次方程。无论是高中的…...

【极限性能,尽在掌控】ROG NUC:游戏与创作的微型巨擘

初见ROG NUC&#xff0c;你或许会为它的小巧体型惊讶。然而&#xff0c;这看似不起眼的机身内&#xff0c;蕴藏着游戏、创意的强大能量。 掌中风暴&#xff0c;性能无界 ROG NUC搭载英特尔高性能处理器&#xff0c;配合高速NVMe SSD固态硬盘以及可选的高端独立显卡&#xff08…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...