FreeRTOS 基础系列文章
基本对象
FreeRTOS——任务
FreeRTOS——队列
FreeRTOS——信号量
FreeRTOS——互斥量
FreeRTOS——任务通知
FreeRTOS——流和消息缓冲区
FreeRTOS——软件定时器
FreeRTOS——事件组
内存管理
FreeRTOS——静态与动态内存分配
FreeRTOS——堆内存管理
FreeRTOS——栈溢出保护
代码组织
FreeRTOS——源代码组织
FreeRTOS——创建新的项目
FreeRTOS——配置文件
内存管理
每次创建任务、队列、互斥量、软件计时器、信号量或事件组时,RTOS 内核都需要 RAM。RAM 可以在 RTOS API 对象创建函数中从 RTOS 堆自动动态分配,也可以由应用程序设计者提供。
如果 RTOS 对象是动态创建的,那么有时可以使用标准 C 库 malloc()
和 free()
函数来实现此目的,但是······
- 它们并不总是在嵌入式系统上可用,
- 它们占用了宝贵的代码空间,
- 它们不是线程安全的,并且
- 它们不是确定性的(执行函数所花费的时间会因调用而异)
······所以通常需要另一种内存分配实现。
一个嵌入式/实时系统可能与另一个系统具有非常不同的 RAM 和时序要求 —— 因此单个 RAM 分配算法将只适用于应用程序的一个子集(还可以有其他分配算法)。
为了解决这个问题,FreeRTOS 将内存分配 API 保留在其可移植层中。可移植层位于实现核心 RTOS 功能的源文件之外,允许提供适用于正在开发的实时系统的特定于应用程序的实现。当 RTOS 内核需要 RAM 时,它不会调用 malloc(),而是调用 pvPortMalloc()。当 RAM 被释放时,RTOS 内核不会调用 free(),而是调用 vPortFree()。
FreeRTOS 提供了多种堆管理方案,其复杂性和功能各不相同。也可以提供您自己的堆实现,甚至可以同时使用两个堆实现。同时使用两个堆实现允许将任务堆栈和其他 RTOS 对象放置在快速的内部 RAM 中,并将应用程序数据放置在较慢的外部 RAM 中。
RTOS 源代码下载中包含的内存分配实现
FreeRTOS 下载中包括五个示例的内存分配实现,每个都在以下小节中进行了描述。这些小节还包括关于提供的每个实现最适合在哪些情况下使用的信息。
每个提供的实现都包含在一个单独的源文