freertos的基础(二)内存管理:堆和栈


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 管理。低地址,内存增长方向向上。

  • :用于任务运行时存储临时数据,每个任务独立拥有。高地址,内存增长方向向下。

### FreeRTOS 中堆的概念 在嵌入式系统开发中,FreeRTOS 提供了灵活的内存管理和任务调度机制。其中,(Heap)和(Stack)是两个重要的概念。 #### 的概念与配置 是指程序运行期间动态分配的一块连续内存区域。对于 FreeRTOS 而言,主要用于创建任务、队列和其他内核对象时所需的内存分配。通过修改 `FreeRTOSConfig.h` 文件中的特定宏定义可以控制的行为[^2]。 - **configTOTAL_HEAP_SIZE**: 定义整个系统的可用大小。开发者可以根据应用程序的需求调整此参数来预留足够的空间给所有可能的任务和服务。 - **configAPPLICATION_ALLOCATED_HEAP**: 当该选项被设为 1 时表示应用层负责初始化并提供一块静态缓冲区作为全局 heap 使用;反之则让 RTOS 自己处理默认情况下会调用标准 C 库函数 malloc/free 来获取/释放资源[^3]。 为了实现自定义管理,在项目启动前需完成如下操作: ```c /* 用户提供的heap buffer */ static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; void vApplicationGetIdleTaskMemory( StaticTask_t **ppxTaskTCBBuffer, StackType_t **ppxTaskStackBuffer, uint32_t *pulTaskStackSize ) { /* 配置空闲任务使用的 TCB 和 */ } void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTaskTCBBuffer, StackType_t **ppxTaskStackBuffer, uint32_t *pulTaskStackSize ) { /* 配置定时器任务使用的 TCB 和 */ } ``` 上述代码片段展示了如何为某些特殊用途的任务预先准备好它们各自的上下文环境以及对应的存储位置。 #### 的概念与配置 每个任务都有自己的私有执行上下文,即所谓的“”。它保存着局部变量、返回地址等信息以便于 CPU 可以正确恢复到之前的状态继续工作。因此合理规划好各个线程所占用的空间至关重要。 - **uxTaskPrioritySet() / uxTaskPriorityGet()**: 设置或查询指定 task 的优先级级别; - **usTaskStackDepthSet() / usTaskStackDepthGet()**: 设定或者读取单个进程允许的最大 stack depth 数量; - **pvPortMalloc()/vPortFree()**: 动态申请/回收一段任意长度的数据结构实例化所需的工作区间[^1]。 当创建一个新的任务时,可以通过 API 函数传递相应的参数来进行个性化定制: ```c BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char* pcName, configSTACK_DEPTH_TYPE usStackDepth, void* pvParameters, UBaseType_t uxPriority, TaskHandle_t* pxCreatedTask ); ``` 在此基础上还可以利用钩子(hook)功能进一步增强安全性监控等功能特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值