FreeRTOS——静态与动态内存分配
FreeRTOS——静态与动态内存分配概述使用动态分配的 RAM 创建 RTOS 对象使用静态分配的 RAM 创建 RTOS 对象概述V9.0.0 之前的 FreeRTOS 版本从特殊的 FreeRTOS 堆分配下面列出的 RTOS 对象使用的内存。FreeRTOS V9.0.0及以上版本提供了应用程序设计者自己提供内存的能力,允许可选地创建以下对象而不需要动态分配内存:任务软件计时器队列事件组二
FreeRTOS 基础系列文章
基本对象
FreeRTOS——任务
FreeRTOS——队列
FreeRTOS——信号量
FreeRTOS——互斥量
FreeRTOS——任务通知
FreeRTOS——流和消息缓冲区
FreeRTOS——软件定时器
FreeRTOS——事件组
内存管理
FreeRTOS——静态与动态内存分配
FreeRTOS——堆内存管理
FreeRTOS——栈溢出保护
代码组织
FreeRTOS——源代码组织
FreeRTOS——创建新的项目
FreeRTOS——配置文件
FreeRTOS——静态与动态内存分配
概述
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()
更多推荐
所有评论(0)