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()