FreeRTOS——静态与动态内存分配
FreeRTOS 基础系列文章
基本对象
FreeRTOS——任务
FreeRTOS——队列
FreeRTOS——信号量
FreeRTOS——互斥量
FreeRTOS——任务通知
FreeRTOS——流和消息缓冲区
FreeRTOS——软件定时器
FreeRTOS——事件组
内存管理
FreeRTOS——静态与动态内存分配
FreeRTOS——堆内存管理
FreeRTOS——栈溢出保护
代码组织
FreeRTOS——源代码组织
FreeRTOS——创建新的项目
FreeRTOS——配置文件
FreeRTOS——静态与动态内存分配
- 概述
- 使用动态分配的 RAM 创建 RTOS 对象
- 使用静态分配的 RAM 创建 RTOS 对象
概述
V9.0.0 之前的 FreeRTOS 版本从特殊的 FreeRTOS 堆分配下面列出的 RTOS 对象使用的内存。FreeRTOS V9.0.0及以上版本提供了应用程序设计者自己提供内存的能力,允许可选地创建以下对象而不需要动态分配内存:
- 任务
- 软件计时器
- 队列
- 事件组
- 二进制信号量
- 计数信号量
- 互斥量
- 递归互斥量
使用静态内存分配还是动态内存分配更好,这取决于应用程序,以及应用程序设计者的偏好。这两种方法各有优缺点,并且可以在同一个RTOS应用程序中使用这两种方法。
使用动态分配的 RAM 创建 RTOS 对象
动态创建 RTOS 对象的好处是更加简单,并且有可能最大限度地减少应用程序的最大 RAM 使用量:
- 创建对象时需要的函数参数较少
- 内存分配在 RTOS API 函数内自动发生。
- 应用程序设计者不需要关心内存分配问题。
- 如果对象被删除,RTOS 对象使用的 RAM 可以重新使用,这可能会减少应用程序的最大 RAM 占用空间。
- 提供了 RTOS API 函数来返回有关堆使用情况的信息,从而可以优化堆大小。
- 可以选择最适合应用程序的内存分配方案,
heap_1.c
用于安全关键应用程序通常需要的简单性和确定性,heap_4.c
用于碎片维护,heap_5.c
用于将堆拆分到多个 RAM 区域,或者由应用程序设计者自己提供分配方案。
以下 API 函数在configSUPPORT_DYNAMIC_ALLOCATION
设置为 1 或未定义时可用 ,使用动态分配的 RAM 创建 RTOS 对象:
- xTaskCreate()
- xTimerCreate()
- xQueueCreate()
- xEventGroupCreate()
- xSemaphoreCreateBinary()
- xSemaphoreCreateCounting()
- xSemaphoreCreateMutex()
- xSemaphoreCreateRecursiveMutex()
使用静态分配的 RAM 创建 RTOS 对象
使用静态分配的 RAM 创建 RTOS 对象的好处是为应用程序设计者提供更多控制权:
- RTOS 对象可以放置在特定的内存位置。
- 最大 RAM 占用空间可以在链接时确定,而不是在运行时确定。
- 应用程序设计者不需要关心如何优雅地处理内存分配失败。
- 它允许在不允许任何动态内存分配的应用程序中使用RTOS(尽管FreeRTOS的分配方案可以克服大多数反对意见)。
以下 API 函数在configSUPPORT_STATIC_ALLOCATION
设置为 1 时可用 ,允许使用应用程序设计者提供的内存创建 RTOS 对象。为了提供内存,应用程序设计者只需声明一个适当对象类型的变量,然后将变量的地址传递给 RTOS API 函数:
- xTaskCreateStatic()
- xQueueCreateStatic()
- xTimerCreateStatic()
- xEventGroupCreateStatic()
- xSemaphoreCreateBinaryStatic()
- xSemaphoreCreateCountingStatic()
- xSemaphoreCreateMutexStatic()
- xSemaphoreCreateRecursiveMutexStatic()
FreeRTOS——静态与动态内存分配相关推荐
- 静态、动态内存分配比较
首先,在使用动态分配内存技术前,必须明白自己在做什么,这样做与其它的方法有什么不同,特别是会产生哪些负面影响,天下没有免费的午餐.动态分配内存与静态分配内存的区别: 1) 静态内存分配是在编译时完成的 ...
- 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...
- 静态内存分配与动态内存分配
静态内存分配与动态内存分配 动机 平时看c/c++的书籍时,总会看到一种观点,说是C/C++语言使用的时候动态内存分配是最重要的,使用malloc等函数分配的内存必须要释放,否则及其容易出现内存泄露. ...
- 【c++内存系列】二、c++动态内存分配和静态内存分配
一.内存的静态分配与动态分配方式 先简单理解静态分配与动态分配: 静态内存分配和动态内存分配比较典型的例子就是数组和链表,数组的长度是预先定义好的,在整个程序中是固定不变的,所以他在内存分配时是以静态 ...
- C语言静态内存分配与动态内存分配
C语言中,内存主要分为5个区,分别为栈区.堆区.全局/静态存储区.常量存储区.代码区. 其中代码区存放源程序的二进制代码,其余四个区都存储进程运行过程中需要的存储的变量. 变量的内存分配有两种:静态与 ...
- 动态内存分配与静态内存分配
文章目录 一.静态内存管理 二.动态内存管理 1.为什么存在动态内存管理 2.动态内存函数的介绍 1).malloc 2.calloc 3.realloc 4.free 5.动态开辟空间代码的标准写法 ...
- 动态内存分配与柔性数组
什么时动态内存分配 一般我们写程序都是在栈区分配空间,如果我们想根据需求想随时存放随时释放数据,堆区可以实现根据需求想系统申请所需大小的空间. 建立内存的动态分配 内存的动态分配是通过系统提供的函数来 ...
- 从更底层研究C\C++动态内存分配
2019独角兽企业重金招聘Python工程师标准>>> 以前在学C++ 的时候,一直不懂:动态内存分配的本质,或者更加深入到底层的意义.虽然说,动态内存分配就是,随机在内存中分配一个 ...
最新文章
- R语言shapiro.test()函数实现Shapiro-Wilk正态分布检验
- 计算机音乐是哪一个,哪种软件适合音乐编辑的计算机版本?
- TSNE Understanding
- PHP生成Mysql数据字典
- [leetcode]剑指offer32-1.从上到下打印二叉树
- 数据库级联操作mysql_Oracle数据库中的级联查询、级联删除、级联更新操作教程...
- 【转】No Persistence provider for EntityManager问题
- java发送带附件的邮件_Java发送邮件(带附件)
- 莫烦---Tensorflow学习
- u深度制作win10系统安装盘教程
- VIM 插件管理工具——vim-plug
- 阿里巴巴国际站首页地址怎复制链接店铺PC自己外贸平台装修链接我的全球旺铺装修全屏代码装修设置复制链接
- ed是什么梗_美国大学EA,ED什么意思?
- 美妆科技:改变美容行业的未来
- Python批量读取txt文件
- nginx 域名重定向跳转至另一个域名
- Docker设置共享文件夹
- 听我一句劝,单片机不要去学STM32真的
- 用树莓派(等)为 USB Midi 键盘增添连接方式
- prometheus-adapter原理分析