FreeRTos学习记录--2.内存管理

news2025/4/22 13:12:49

后续的章节涉及这些内核对象:task、queue、semaphores和event group等。为了让FreeRTOS更容易使用,这些内核对象一般都是动态分配:用到时分配,不使用时释放。使用内存的动态管理功能,简化了程序设计:不再需要小心翼翼地提前规划各类对象,简化API函数的涉及,甚至可以减少内存的使用。

在C语言的库函数中,有mallc、free等函数,但是在FreeRTOS中,它们不适用:

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

FreeRTOS的5中内存管理方法

FreeRTOS中内存管理的接口函数为:pvPortMallocvPortFree,对应于C库的malloc、free。 文件在FreeRTOS/Source/portable/MemMang下,它也是放在portable目录下,表示你可以提供自己的函数。

源码中默认提供了5个文件,对应内存管理的5种方法。

文件优点缺点
heap_1.c分配简单,时间确定只分配、不回收
heap_2.c动态分配、最佳匹配碎片、时间不定
heap_3.c调用标准库函数速度慢、时间不定
heap_4.c相邻空闲内存可合并可解决碎片问题、时间不定
heap_5.c在heap_4基础上支持分隔的内存块可解决碎片问题、时间不定

以上均是引用韦东山老师教程:第8章 内存管理 | 百问网


我们一直讲内存,堆栈,以前是裸机现在引入了任务,每个任务有自己的栈空间,保存任务的变量等等,那么这些内存是怎么在ram、rom里面分布的呢?以及编译完成的可执行文件放在flash上面,又是什么情况?这么多内存之间什么关系?一直一来这里都没理清,接下来参考佬的文章,来详细看一下。

STM32的内存管理相关(内存架构,内存管理,map文件分析)

STM32的内存管理相关(内存架构,内存管理,map文件分析)_stm32内存管理有什么用-CSDN博客

嵌入式RTOS的 任务栈 和 系统栈 - 知乎

这里就不再继续贴原文了,原文写的非常详细,请移步学习。

在嵌入式系统中,程序的内存布局通常分为 Flash(或 ROM)和 RAM。Flash 用于存储程序代码和只读数据,而 **RAM 用于存储程序运行时的数据,包括全局变量、栈和堆。**下面是分布图示例:

flash:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RAM:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实上面这个图片并不全:

RAM(数据存储器)–这里参考Linux系统的应用程序在内存上的分布

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • .data:已初始化的全局变量和静态变量的运行时存储位置。这些变量在程序启动时从 Flash 的 .data 段复制到 RAM 中。
  • .bss:未初始化的全局变量和静态变量的运行时存储位置。这些变量在程序启动时在 RAM 中被自动清零。
  • 堆(Heap):用于动态内存分配,如使用 mallocfree 函数。
  • 栈(Stack):用于存储函数调用时的局部变量、参数和返回地址。每个任务或线程通常有自己的栈。

RAM和ROM对CPU的编址方式:

在一些嵌入式系统中,RAM和ROM对于CPU可以是统一编址的,也可以是独立编址的,这取决于具体的硬件设计和架构。统一编址时,CPU通过相同的地址总线来访问RAM和ROM,它们在同一个地址空间内,只是地址范围不同。独立编址则使用不同的控制信号和地址空间来分别访问RAM和ROM。

程序代码的存储和执行:

程序代码通常是存储在Flash(或ROM)中,而不是直接在RAM中运行。这是因为Flash是一种非易失性存储器,可以永久保存数据,而RAM是易失性存储器,断电后数据会丢失。

程序代码(包括 .text 段、.rodata 段、.data 段和 .bss 段)在编译后被存储在Flash中。尽管程序代码存储在Flash中,但实际执行时,CPU是从RAM中读取指令的。这是因为CPU直接从RAM中读取指令的速度比从Flash中读取要快得多。

这些段通常在编译后的可执行文件中以ELF(Executable and Linkable Format)格式存在。ELF是一种常见的可执行文件格式,它不仅用于Linux系统,也被许多其他系统使用。ELF文件包含了程序的代码、数据、符号表、重定位信息等,这些信息在程序加载到内存中时会被操作系统或引导加载程序(如BootLoader)使用。

在嵌入式系统中,ELF文件可能会被进一步处理,例如通过链接器脚本将其分割成适合特定硬件架构和内存布局的段。这些段最终会被加载到目标硬件的Flash和RAM中。因此,虽然ELF文件是程序的最终形式,但它内部的结构和段的组织方式是由编译器和链接器根据链接器脚本和目标平台的要求来确定的。

启动过程

  1. 启动时的代码复制
    • 在系统启动时,Bootloader(或系统启动代码)会将Flash中的 .text 段和 .data 段复制到RAM中。
    • .text 段包含程序的可执行代码,.data 段包含已初始化的全局变量和静态变量。
  2. .bss 段的处理
    • .bss 段包含未初始化的全局变量和静态变量。
    • 在系统启动时,Bootloader会将 .bss 段在RAM中清零。
  3. 程序开始执行
    • 一旦 .text 段和 .data 段被复制到RAM中,并且 .bss 段被清零,程序就可以开始在RAM中执行了。
    • CPU从RAM中的 .text 段开始执行指令。

上电汇编到kernel入口地址的编址:

从系统上电到进入内核入口地址的过程中,涉及到的内存编址通常是基于整个系统的内存映射来进行的。如果是统一编址,那么这一过程中对RAM和ROM的访问都遵循统一的地址空间规则。在启动过程中,会根据硬件的初始化设置和引导程序的逻辑,将程序从ROM加载到RAM中合适的位置,并跳转到内核入口地址开始执行。

寻址范围与处理器的关系:

寻址范围确实与SoC的架构以及处理器的位数有关。一般来说,n位的处理器理论上的寻址空间为2^n 。例如,32位处理器的寻址范围是2^32,即4GB的地址空间。但实际的寻址范围还可能受到硬件设计、内存管理单元(MMU)的配置以及系统中其他设备占用地址空间等因素的限制。

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

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

相关文章

HAL库(STM32CubeMX)——高级ADC学习、HRTIM(STM32G474RBT6)

系列文章目录 文章目录 系列文章目录前言存在的问题HRTIMcubemx配置前言 对cubemx的ADC的设置进行补充 ADCs_Common_Settings Mode:ADC 模式 Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选 ADC_Se…

单例模式(线程安全)

1.什么是单例模式 单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单…

FreeRTos学习记录--1.工程创建与源码概述

1.工程创建与源码概述 1.1 工程创建 使用STM32CubeMX,可以手工添加任务、队列、信号量、互斥锁、定时器等等。但是本课程不想严重依赖STM32CubeMX,所以不会使用STM32CubeMX来添加这些对象,而是手写代码来使用这些对象。 使用STM32CubeMX时&…

进程控制(linux+C/C++)

目录 进程创建 写时拷贝 fork 进程终止 退出码 进程退出三种情况对应退出信号 :退出码: 进程退出方法 进程等待 两种方式 阻塞等待和非阻塞等待 小知识 进程创建 1.在未创建子进程时,父进程页表对于数据权限为读写,对于…

TensorBoard如何在同一图表中绘制多个线条

1. 使用不同的日志目录 TensorBoard 会根据日志文件所在的目录来区分不同的运行。可以为每次运行指定一个独立的日志目录,TensorBoard 会自动将这些目录中的数据加载并显示为不同的运行。 示例(TensorFlow): import tensorflow…

微软Entra新安全功能引发大规模账户锁定事件

误报触发大规模锁定 多家机构的Windows管理员报告称,微软Entra ID新推出的"MACE"(泄露凭证检测应用)功能在部署过程中产生大量误报,导致用户账户被大规模锁定。这些警报和锁定始于昨夜,部分管理员认为属于误…

基于FPGA的一维时间序列idct变换verilog实现,包含testbench和matlab辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 DCT离散余弦变换 4.2 IDCT逆离散余弦变换 4.3 树结构实现1024点IDCT的原理 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) matlab仿真结果 FPGA仿真结果 由于FP…

Linux进程5-进程通信常见的几种方式、信号概述及分类、kill函数及命令、语法介绍

目录 1.进程间通信概述 1.1进程通信的主要方式 1.2进程通信的核心对比 2.信号 2.1 信号的概述 2.1.1 信号的概念 2.2信号的核心特性 2.3信号的产生来源 2.4信号的处理流程 2.5关键系统调用与函数 2.6常见信号的分类及说明 2.6.1. 标准信号(Standard Sig…

[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析

[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析 服务展示: 运行脚本: 剩余服务: 一、脚本设计背景与核心价值 在Linux服务器运维中,服务管理是日常操作的重要环节。本文介绍的智能服务管理脚本&a…

C++算法(10):二叉树的高度与深度,(C++代码实战)

引言 在二叉树的相关算法中,高度(Height)和深度(Depth)是两个容易混淆的概念。本文通过示例和代码实现,帮助读者清晰区分二者的区别。 定义与区别 属性定义计算方式深度从根节点到该节点的边数根节点深度…

Psychology 101 期末测验(附答案)

欢呼 啦啦啦~啦啦啦~♪(^∇^*) 终于考过啦~ 开心(*^▽^*) 撒花✿✿ヽ(▽)ノ✿ |必须晒下证书: 判卷 记录下判卷,还是错了几道,填空题2道压根填不上。惭愧~ 答案我隐藏了,实在想不出答案的朋友可以留言,不定时回复。 建议还是认认真真的学习~认认真真的考试~,知识就…

安全协议分析概述

一、概念 安全协议(security protocol),又称密码协议。是以密码学为基础的消息交换协议,在网络中提供各种安全服务。(为解决网络中的现实问题、满足安全需求) 1.1 一些名词 那什么是协议呢? …

基础学习:(7)nanoGPT 剩下的细节

文章目录 前言3 继续巴拉结构3.1 encode 和 embedding3.2 全局layernorm3.3 lm_head(language modeling) 和 softmax3.4 softmax 和 linear 之间的 temperature和topk3.5 weight tying 前言 在 基础学习:(6)中, 在运行和训练代码基础上,向代…

Spark-SQL连接Hive总结及实验

一、核心模式与配置要点 1. 内嵌Hive 无需额外配置,直接使用,但生产环境中几乎不使用。 2. 外部Hive(spark-shell连接) 配置文件:将hive-site.xml(修改数据库连接为node01)、core-site.xml、…

Linux Wlan-四次握手(eapol)框架流程

协议基础 基于 IEEE 802.1X 标准实现的协议 抓包基础 使用上一章文章的TPLINK wn722n v1网卡在2.4G 频段抓包(v2、v3是不支持混杂模式的) eapol的四个交互流程 根据不同的认证模式不同,两者的Auth流程有所不同,但是握手流程基…

web组件和http协议

1.web组件 2.自定义元素 3.影子DOM 4.HTML模板 5.http协议 6.tcp ip协议

软件工程师中级考试-上午知识点总结(下)

6. 知识产权和标准化 软件著作权客体:指的是受软件著作权保护的对象,即计算机程序和相关文档。知识产权具有严格的地域性。不受保护期限制:著名权、修改权、保护作品完整权;注意的是,发表权受保护期限制。专利权在期满…

IO流--字节流详解

IO流 用于读写数据的(可以读写文件,或网络中的数据) 概述: I指 Input,称为输入流:负责从磁盘或网络上将数据读到内存中去 O指Output,称为输出流,负责写数据出去到网络或磁盘上 因…

Cesium学习笔记——dem/tif地形的分块与加载

前言 在Cesium的学习中,学会读文档十分重要!!!在这里附上Cesium中英文文档1.117。 在Cesium项目中,在平坦坦地球中加入三维地形不仅可以增强真实感与可视化效果,还可以​​提升用户体验与交互性&#xff0c…

Java排序算法百科全书:原理、实现与实战指南

一、排序算法全景视图 1. 算法分类体系 graph TDA[排序算法] --> B[比较排序]A --> C[非比较排序]B --> B1[基本排序]B1 --> B11[冒泡排序]B1 --> B12[选择排序]B1 --> B13[插入排序]B --> B2[高效排序]B2 --> B21[快速排序]B2 --> B22[归并排序]B…