1. 堆(Heap)
定义
堆是 FreeRTOS 中用于动态内存分配的内存区域。FreeRTOS 提供了多种堆管理方案(如 heap_1、heap_2、heap_4 等),开发者可以根据需求选择合适的内存管理策略。
作用
-
用于动态分配内存,例如创建任务、队列、信号量等内核对象时,从堆中分配内存。
-
堆的大小由开发者定义,通常在 FreeRTOS 配置文件(如
FreeRTOSConfig.h
)中设置。
特点
-
堆是全局共享的内存区域。
-
动态分配的内存需要手动释放(取决于堆管理方案)。
malloc free(注意有 malloc一定要有free)
malloc:从堆里划出一块空间给程序使用
free:使用完,将这块内存空间标记为“空闲”,可以再次使用
2. 栈(Stack)
定义
栈是每个任务独立拥有的内存区域,用于存储任务的局部变量、函数调用信息、中断上下文等。
作用
-
用于任务运行时保存临时数据。
-
每个任务都有自己的栈空间,栈的大小在创建任务时指定。
特点
-
栈是任务私有的内存区域。
-
栈空间不足会导致栈溢出,可能引发系统崩溃。
堆和栈的区别
特性 | 堆(Heap) | 栈(Stack) |
---|---|---|
用途 | 动态内存分配(如任务、队列、信号量) | 存储任务局部变量、函数调用信息 |
内存管理 | 全局共享,由 FreeRTOS 内存管理方案管理 | 每个任务独立拥有 |
分配方式 | 动态分配,手动释放(取决于堆管理方案) | 自动分配,任务结束时自动释放 |
大小设置 | 在配置文件中定义堆大小 | 在创建任务时定义栈大小 |
溢出影响 | 可能导致内存分配失败 | 导致栈溢出,系统崩溃 |
总结
-
堆:用于动态内存分配,全局共享,由 FreeRTOS 管理。低地址,内存增长方向向上。
-
栈:用于任务运行时存储临时数据,每个任务独立拥有。高地址,内存增长方向向下。