一、堆(HEAP)
堆是一块由程序员或系统统一管理的内存区域,它的核心作用是“按需分配”。在 FreeRTOS 中,绝大多数内核对象,例如任务(Task)、队列(Queue)、信号量(Semaphore)等,都是通过动态分配创建的,而这些分配行为本质上都发生在堆上。
只要你在代码中看到 pvPortMalloc,或者调用了诸如 xTaskCreate、xQueueCreate 这样的函数,本质上就是在向堆申请内存。FreeRTOS 会从一块预先定义好的内存区域(heap)中划分出一部分给这些对象使用。
堆的特点是灵活但需要管理。它可以在运行过程中不断分配和释放,但也因此可能产生碎片问题。如果管理不当,可能会出现“内存够但申请失败”的情况。因此 FreeRTOS 提供了多种 heap 管理方案(heap_1~heap_5)来权衡性能和碎片问题。
堆 = 系统的“资源池”,所有需要“创建”的对象都从这里来
二、栈(STACK)
栈的作用完全不同,它并不是用来“创建对象”的,而是用来支撑程序的运行过程。具体来说,栈用于保存函数调用时的局部变量、函数参数、返回地址以及寄存器上下文等信息。
在 FreeRTOS 中,每个任务都会分配一块“独立的栈空间”。当任务运行时,它的所有函数调用、局部变量等都会存储在自己的栈中,这样不同任务之间不会互相干扰。这也是为什么 FreeRTOS 能够支持多任务运行的重要基础。
栈的特点是自动管理、高效但空间固定。函数调用时入栈,函数返回时出栈,整个过程由编译器和CPU自动完成,不需要程序员手动干预。但如果栈空间分配过小,就可能发生“栈溢出”,这是嵌入式系统中非常常见且危险的问题。
栈 = 任务运行时的“工作空间”,决定程序能否稳定执行。


