FreeRTOS--内存管理

2023-05-16

    FreeRTOS操作系统将内核和内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型 不关心内存管理函数是如何实现的。所以在 FreeRTOS 中提供了多种内存分配算法(分配策略),但是上层接口(API)却是统一的。这样做可以增加系统的灵活性:用户可以选择对自己更有利的内存管理策略,在不同的应用场合使用不同的内存分配策略。

在嵌入式程序设计中内存分配应该是根据所设计系统的特点来决定选择使用动态内存分配还是静态内存分配算法,一些可靠性要求非常高的系统应选择使用静态的,而普通的业务系统可以使用动态来提高内存使用效率。静态可以保证设备的可靠性但是需要考虑内存上限,内存使用效率低,而动态则是相反。
  在电脑中我们可以用 malloc()和 free()这两个函数动态的分配内存和释放内存。但是,在嵌入式实时操作系统中,调用 malloc()和 free()却是危险的,原因有以下几点:
  1. 这些函数在小型嵌入式系统中并不总是可用的,小型嵌入式设备中的 RAM 不足。
  2.  它们的实现可能非常的大,占据了相当大的一块代码空间。
  3.  他们几乎都不是安全的。
  4.  它们并不是确定的,每次调用这些函数执行的时间可能都不一样。
  5.  它们有可能产生碎片。
  6.  这两个函数会使得链接器配置得复杂。
  7.  如果允许堆空间的生长方向覆盖其他变量占据的内存,它们会成为 debug 的灾难。
   不同的嵌入式系统具有不同的内存配置和时间要求。所以单一的内存分配算法只可能适合部分应用程序。因此,FreeRTOS 将内存分配作为可移植层面(相对于基本的内核代码部言),FreeRTOS 有针对性的提供了不同的内存分配管理算法,这使得应用于不同场景的设备可以选择适合自身内存算法。FreeRTOS 的 V9.0.0 版本为我们提供了 5 种内存管理算法,分别是 heap_1.c、heap_2.c、heap_3.c、heap_4.c、heap_5.c,源文件存放于FreeRTOS\Source\portable\MemMang 路径下,在使用的时候选择其中一个添加到我们的工程中去即可。

内存管理的应用场景:

   内存管理的主要工作是动态划分并管理用户分配好的内存区间,主要是在用户需要使用大小不等的内存块的场景中使用,当用户需要分配内存时,可以通过操作系统的内存申请函数索取指定大小内存块,一旦使用完毕,通过动态内存释放函数归还所占用内存,使之可以重复使用(heap_1.c 的内存管理除外)。例如动态分配。

内存管理方案:

heap_1.c:

FreeRTOS提供内存管理方案中最简单的一个:只能申请内存而不能进行内存释放 并且申请内存的时间是一个常量 内存利用率不高

1 、 用于从不删除任务、队列、信号量、互斥量等的应用程序(实际上大多数使用FreeRTOS 的应用程序都符合这个条件)。
2 、 函数的执行时间是确定的并且不会产生内存碎片

  1. 变量 xNextFreeByte 用来定位下一个空闲的内存堆位置。
  1. 静态变量 pucAlignedHeap 是一个指向对齐后的内存堆起始地址,我们使用一个数组作为堆内存,但是数组的起始地址并不一定是对齐的内存地址,所以我们需要得到FreeRTOS 管理的内存空间对齐后的起始地址,并且保存在静态变量 pucAlignedHeap 中。

      heap_2.c:

      采用最佳匹配算法,Heap_2.c 方案支持释放申请的内存,但是它不能把相邻的两个小的内存块合成一个大的内存块,对于每次申请内存大小都比较固定的,这个方式是没有问题的,而对于每次申请并不是固定内存大小的则会造成内存碎片

heap_2.c 方案具有以下特点:
   1. 可以用在那些反复的删除任务、队列、信号量、等内核对象且不担心内存碎片的
应用程序。
   2. 如果我们的应用程序中的队列、任务、信号量、等工作在一个不可预料的顺序,
这样子也有可能会导致内存碎片。
   3. 具有不确定性,但是效率比标准 C 库中的 malloc 函数高得多
   4. 不能用于那些内存分配和释放是随机大小的应用程序。

 内存申请函数 pvPortMalloc():

内存释放函数 vPortFree():
    分配内存的过程简单,那么释放内存的过程更简单,只需要向内存释放函数中传入要
释放的内存地址,那么系统会自动向前索引到对应链表节点,并且取出这块内存块的信息,
将这个节点插入到空闲内存块链表中,将这个内存块归还给系统.

 

heap_3.c:

    heap_3.c 方案只是简单的封装了标准 C 库中的 malloc()free()函数,并且能满足常用的编译器。重新封装后的 malloc()free()函数具有保护功能,采用的封装方式是操作内存前挂起调度器、完成后再恢复调度器。

heap_3.c 方案具有以下特点:

1 、 需要链接器设置一个堆, malloc() free() 函数由编译器提供。
2 、 具有不确定性。
3 、 很可能增大 RTOS 内核的代码大小。
heap_4.c:
    heap_4.c 方案与 heap_2.c 方案一样都采用最佳匹配算法来实现动态的内存分配,但是不一样的是 heap_4.c 方案还包含了一种合并算法,能把相邻的空闲的内存块合并成一个更 大的块,这样可以减少内存碎片。 heap_4.c 方案特别适用于移植层中可以直接使用 pvPortMalloc() vPortFree() 函数来分配和释放内存的代码。
  
heap_4.c 方案具有以下特点:
1 、可用于重复删除任务、队列、信号量、互斥量等的应用程序
2 、可用于分配和释放随机字节内存的应用程序,但并不像 heap2.c 那样产生严重的内
存碎片。
3 、具有不确定性,但是效率比标准 C 库中的 malloc 函数高得多
内存申请函数 pvPortMalloc()  内存释放函数 vPortFree() :

 heap_5.c:

   采用最佳匹配算法和合并算法,并且允许内存堆跨越多个非连续的内存区,也就是允许在不连续的内存堆中实现内存 分配,比如用户在片内 RAM 中定义一个内存堆,还可以在外部 SDRAM 再定义一个或多 个内存堆,这些内存都归系统管理。
heap_5.c 方案通过调用 vPortDefineHeapRegions() 函数来实现系统管理的内存初始化,在内存初始化未完成前不允许使用内存分配和释放函数。
使用实例:

 

实验:

    创建了两个任务,分别是 LED 任务与内存管理测试任务,内存管理测试任务通过检测按键是否按下来申请内存或释放内存, 当申请内存成功就像该内存写入一些数据,如当前系统的时间等信息,并且通过串口输出 相关信息; LED 任务是将 LED 翻转,表示系统处于运行状态。在不需要再使用内存时,注 意要及时释放该段内存,避免内存泄露。
 

 

  

实验现象:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS--内存管理 的相关文章

  • ORBSLAM2系统学习(二)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 前言 一 ORBSLAM2简介 二 系统综述 系统框架 追踪线程Tracking 局部建图线程local mapping 回环检测l
  • QT-串口调试助手自动定时收发、十六进制转换

    这篇调试助手比较详细 xff1a 不仅有十六进制转换 串口自动识别还有自动发送等功能 程序链接 xff0d xff0d 欢迎关注哦 https download csdn net download m0 46436890 13793486
  • [记录]webpack打包引用了fluent-ffmpeg的js报错解决

    参考博客 xff1a Cannot resolve module fs npm 编译失败 xff1a Can t resolve child process
  • 2020年三非上岸北邮计算机院考研经验贴(励志)

    64 TOC 两次北邮考研经验 前言 xff1a 这是我两次考北邮的日常生活的点点滴滴 xff0c 我不是什么名校出身 xff0c 也不是什么学霸 xff0c 但是有梦想终归会成功的 xff0c 希望我的经历能够带给你们一些鼓励 xff0c
  • 23条养生小常识,赶紧看看吧,千万不要错过!

    一 情绪不畅容易生病 天气多变时 xff0c 人们情绪很容易受气候的影响而抑郁 xff0c 情绪变化也影响了食欲 xff0c 从而引发胃病 在胃病的预防上要重视精神与饮食的调摄 xff0c 一个人经常情绪不畅 xff0c 很容易被疾病侵袭
  • Windows上安装GPU版本TensorFlow的详细安装步骤

    1 检查并安装VS环境 安装GPU版本的TensorFlow xff0c 首先需要检查VS环境 xff0c 如果没有需要安装 xff0c 但是VS全部安装会占内存 xff0c 因此可以去Download Visual C 43 43 Red
  • ISE14.7逻辑综合与实现工作过程

    1 1 ISE14 7逻辑综合与实现工作过程 1 1 1 本节目录 1 本节目录 2 本节引言 3 FPGA简介 4 ISE14 7逻辑综合与实现工作过程 5 结束语 1 1 2 本节引言 不积跬步 无以至千里 不积小流 无以成江海 就是说
  • (4)FPGA开发工具介绍(第1天)

    4 FPGA开发工具介绍 第1天 1 文章目录 1 文章目录 2 FPGA初级课程介绍 3 FPGA初级课程架构 4 FPGA开发工具介绍 第1天 5 技术交流 6 参考资料 2 FPGA初级课程介绍 1 FPGA初级就业课程共100篇文章
  • (02)Shell脚本【可执行程序】

    02 Shell脚本 可执行程序 1 目录 1 1 Shell脚本简介 1 2 nbsp Shell脚本文件 1 3 nbsp Shell脚本作用 1 4 nbsp Shell运行环境 1 5 nbsp Shell脚本 可执行程序 1 6
  • AD20知识补充及四层板了解

    之前自己动手画过一个stm32c8t6最小系统的板子 xff0c 但由于当时学的比较仓促对AD的很多东西不了解 xff0c 如今想了解四层板子 xff0c 就从b站上把AD20从新建项目工程到最后画完板子整个完整的流程又重新学习了一遍 xf
  • 常用服务器和存储设备管理口默认IP用户名密码汇总(持续更新)

    一 服务器设备默认管理 1 宝德4卡服务器 默认用户名 xff1a ADMIN 密码 xff1a 11111111 2 超微服务器 默认用户名 xff1a ADMIN 密码 xff1a admin000 默认用户名 xff1a ADMIN
  • RS232,RS485原理与应用

    Uart存在的问题 1 没有一个统一连接器的标准 xff0c 且只规定了数据传输的顺序 xff08 只规定了两根线 xff09 2 只规定了高电平为1 xff0c 低电平为0 xff08 例 xff1a 51是5v xff0c stm32为
  • STM32的面试题

    一 STM32F1和F4的区别 1 内核不同 xff1a F1内核为cortex m3 xff0c F4为cortex m4 2 主频不同 xff1a F1主频72MHz xff0c F4168MHz xff08 主频就是CPU内核时钟频率
  • GCC【3】-Win10 + CMake + MinGW+搭建STM32 GCC开源开发环境

    文章目录 前言一 安装git bash二 安装MinGW MinGW w642 1 MinGW是什么 xff1f 2 2 MinGW gcc安装简图2 2 MinGW make安装简图 三 安装Make for Windows3 1 下载安
  • Zookeeper集群无法启动的原因分析

    Zookeeper集群无法启动的原因分析 xff1a centos7上搭建三台zookeeper xff0c 相关文件配置没有问题 问题描述 xff1a span class token punctuation span atguigu 6
  • 美女体验小米无人机4K版:直接解锁新手模式

    其实说实话 xff0c 这小米无人机4K版我们拿到手上已经挺长时间的了 但是奈何全北京禁飞 xff0c 所以一直没有机会飞飞看 xff0c 于是我们就在解禁之后的第一时间 xff0c 跑到了六环外为大家带来试飞 就让我们从开箱开始 xff0
  • intel realsense摄像头标定教程(win10环境)

    intel realsense摄像头标定教程 准备工具 Intel RealSense D400 Series Dynamic Calibration Toolsprint target fixed width pdf或者对应手机app I
  • TCP网络编程例子(C语言实现)

    说明 xff1a 之前在CSDN上找TCP编程时 xff0c 发现有各种版本 不同版本之间写法不一 xff0c 所以自己写了个C语言版本的 xff0c 记录下来 服务端代码 xff1a span class token comment TC
  • D435i相机的标定及VINS-Fusion config文件修改

    引言 当我们想使用D435i相机去跑VINS Fusion时 xff0c 如果不把标定过的相机信息写入config文件中就运行 xff0c 这样运动轨迹会抖动十分严重 xff0c 里程计很容易漂 接下来将介绍如何标定D435i相机 xff0
  • 【C语言】--- while(1)语句内的if(i--)的无限循环

    例子 span class token macro property span class token directive keyword include span span class token string lt stdio h gt

随机推荐

  • uC/OS-III移植后发现程序停在空闲任务出不来

    今天移植了一下UCOS III的源码到STM32F103RCT6的板子上 xff0c 然后发现在所有任务都初始化完成后 xff0c 使用OSTimeDlyHMSM函数进行延时后就再也跳不出空闲任务了 xff0c 当时还以为是在移植程序的时候
  • 对uC/OS-III时钟节拍运转机制的一点理解

    目录 如何产生时基信号系统时钟中断管理时基任务时基列表更新写在最后 我在初学uC OS III的时候 xff0c 时基产生后到底是如何去驱动操作系统运转的 xff0c 对于这个问题一直有很多疑问 xff0c 最后读了手册并且仔细推敲源码后终
  • Altium Designer 常见的问题和解决办法,常更!

    本人的Altium Designer 版本是18 1 8 问题1 xff1a AD左上角有一个坐标显示框 xff0c 今天按键盘不小心弄没了 xff0c 然后弄出来后发现又会随着鼠标移动跟着移动 xff0c 不再固定到左上角了 相关解释 x
  • 推荐一款串口调试助手(win10,无广告,功能齐全,操作简单)

    目录 1 安装2 打开软件3 测试功能4 使用脚本功能5 波形显示功能6 升级专业版 作为一个搞嵌入式软件的 xff0c 串口是我们经常需要使用的一个外设资源 xff0c 对应的我们在调试的时候就需要用到一些工具 xff0c 本人也用过目前
  • STM32L1单片机的ADC必须开启HSI才能工作

    之前玩过F1和F4的板子 xff0c 这段时间 xff0c 接个项目需要用低功耗 xff0c 所以就整了STM32L151单片机 xff0c 然后今天在写ADC的时候 xff0c 发现了一个问题 xff0c 就是STM32L151MCU必须
  • 深入理解Linux文件系统与日志文件,快来看!

    目录 一 inode与block1 1 inode和block概述1 2 inode的内容 1 11 3 inode的内容 1 21 4 inode的内容 1 31 5 inode的号码1 6 文件存储小结1 7 inode的大小1 8 i
  • AT 指令集详解

    AT 指令集详解 1 AT的历史与应用1 1 AT的历史1 2 AT的优点1 3 AT命令与ppp协议的关系 2 AT的命令格式3 DCE的状态切换与AT的命令拨号流程3 1 初始化DCE的Modem设备3 2 拨号连接3 3 数据传输及处
  • 幽暗的廊桥,热烈的遗梦:火了25年的中年“杰克苏”童话

    廊桥是一种有遮盖的桥梁 路人经过一段幽暗隐蔽的空间后 xff0c 已身在彼岸 廊桥遗梦 的作者罗伯特 詹姆斯 沃勒于2017年3月10日凌晨 xff0c 在美国德克萨斯州弗雷德里克斯堡的家中去世 xff0c 享年77岁 作者当年如有神助 x
  • STM32L152 实现电源电压采集 基于HAL库实现

    CudeMX中对相关ADC的配置 这里用ADC1的通道17 keil中 自己编写 ADC Getvalue的值的函数 在主函数中调用 在debug模式下 可以在watch窗口中看见相关值 单位为mv
  • 基本共射放大电路的动态分析以及放大电路Q点的稳定

    求解静态 xff1a 直流通路 xff1a VCC 61 Ubeq 43 Ibq Rb gt Ibq gt Ieq 2 动态分析 xff1a 交流通路 xff1a H参数等效 xff1a 在放大过程中 xff1a 动态的Ube秉承动态的Ib
  • FreeRTOS 创建任务

    用已经移植好的工程模板 创建一个简单的任务 xff08 电量LED灯 xff09 1 硬件初始化 需要用到开发板上的LED灯小江LED灯相关的函数初始化 xff0c 在main c中创建一个Init xff08 xff09 函数 xff0c
  • 差分放大电路及动态分析

    由温度引起的零点漂移成为温漂 xff0c 引入负反馈 加入Re电阻 从抑制温度漂移的角度来说 希望Re越大越好 但是会导致放大倍数变小 加一个镜像的电路可以让两边一起浮动 但是两个Re可以共用一个 于是改成下面的 形式 Re电阻现在的作用变
  • FreeRTOS的启动流程

    目前的RTOS中有两种比较流行的启动方式 万事俱备 只欠东风 xff1a 在main函数中将硬件初始化 xff0c rtos系统初始化 xff0c 所有任务的创建都完成 再启动RTOS的调度器 xff08 在刚刚创建的的任务中选择一个优先级
  • FreeRTOS--消息队列

    队列 xff1a 队列又称为消息队列 xff0c 是一种用于任务间通信的数据结构 xff0c 是一种异步通信方式 xff0c 实现接收来自其他任务或者中断的不固定长度的消息 xff0c 任务能够从队列中读取消息 xff0c 当队列中消息是空
  • FreeRTOS--信号量

    信号量的基本概念 xff1a 信号量是一种实现任务间通信的机制 xff0c 可以实现任务之间同步或者临界资源的互斥访问 xff0c 常用于协助一组相互竞争的任务来访问临界资源 信号量是一个非负整数 xff0c 所以获取它的任务都会将整数减一
  • FreeRTOS-互斥信号量

    互斥量又称为互斥信号量 xff0c 本质是一种特殊的二值信号量 xff0c 支持互斥量所有权 xff0c 递归访问 xff0c 以及防止优先翻转的特性 xff0c 用于实现对临界资源的独占式处理 任意时刻互斥量的状态只有两种 xff0c 开
  • FreeRTOS--软件定时器

    定时器 xff1a 从指定的时刻开始 经过一个指定时间 触发一个超时事件 用户自定义定时器的周期和频率 硬件定时器 xff1a 芯片本身提供的定时功能 一般是外部晶振提供给芯片输入时钟 芯片向软件模块一直配置寄存器 接收控制输入 到达设定时
  • FreeRTOS--任务通知

    任务通知 xff1a 每个任务有一个32位的通知值在大多数情况下 xff0c 任务通知可以替代二值信号量 计数信号量 事件组 xff0c 也可以替代长度为 1 的队列 xff08 可以保存一个 32位整数或指针值 xff09 使用任务通知比
  • 模拟实现strchr,strrchr,strstr,strrstr函数

    模拟实现strchr strnchr strstr strrstr函数 strchr 查找字符串s中首次出现字符c的位置 xff0c 返回首次出现c的位置的指针 xff0c 如果s中不存在c则返回NULL include lt stdio
  • FreeRTOS--内存管理

    FreeRTOS操作系统将内核和内存管理分开实现 xff0c 操作系统内核仅规定了必要的内存管理函数原型 不关心内存管理函数是如何实现的 所以在 FreeRTOS 中提供了多种内存分配算法 xff08 分配策略 xff09 xff0c 但是