FreeRTOS 动态内存分配

本文探讨了FreeRTOS系统中malloc和pvPortMalloc两种动态内存管理接口的区别,包括pvPortMalloc作为线程安全且可动态调整内存的内核特性,以及与malloc在性能和功能上的差异,强调了pvPortMalloc在多线程环境下的优势和获取剩余内存的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FreeRTOS系统下通常可用的动态内存管理接口有:

malloc和pvPortMalloc两个。在使用时略有区别。
malloc是c标志库提供的库函数,头文件:<stdlib.h>,功能是在堆内存中动态分配一块空间
使用malloc申请内存空间需要注意
1.使用前先调用malloc init函数数进行内存堆初始化
2.使用malloc时注意内存堆剩余空间是否足够,不够返回NULL,申请空间过大会导致内存溢出
3.使用malloc申请内存空间后,调用free函数释放内存
4.若申请的内存空间不存在/超出可用内存空间范围将崩溃
5.malloc可用空间大小在初始化时定义,通常在系统的heap_size定义。

freeRTOS动态内存分配
在freeRTOS中,通常使用pvPortMalloc动态内存分配
1.pvPortMalloc: 这是freeRTOS提供的内存分配函数,类似于标准C库中的malloc函数。它从内存堆中分配内存块。
2vPortFree: 这是freeRTOS提供的内存释放函数,类似于标准C库中的free函数。它将已分配的内存块释放回内存堆.

pvPortMalloc和malloc区别
pvPortMalloc是FreeRTOS内核提供的内存分配函数,它和malloc函数有一些不同,包括:
1.pvPortMalloc是线程安全的,而malloc不是,这意味着pPortMalloc可以在多线程环境下使用,而malloc可能会引起竞争条件.
2.pvPortMalloc通常比malloc慢一些,这是因为pvPortMalloc需要调用内部的斥体保护内存池的访问,而malloc不需要。
3. pvPortMalloc可以根据需要动态地分配内存,而malloc则只能分配在堆上的内存。
4.pvPortMalloc可以用来在内存不足的情况下触发内存溢出处理函数。而malloc则无法这样做
5.pvPortMaloc是一个特珠的内存分配函数,适用于FreeRTOS内核,用于在多线程环境下分配内存。如果使用FreeRTOS,也可以继续使用malloc,但是不推荐.
6.在freertos使用pvPortMaloc,可以通过xPortGetFreeHeapSize ()获取剩余可用动态内存大小,但是c库提供的malloc不支持查询剩余可用动态内存大小,如果需要获取可以再其之上进行封装获取。

### STM32 FreeRTOS 动态内存分配实例 在嵌入式系统开发中,动态内存管理对于资源有限的微控制器至关重要。FreeRTOS 提供了几种不同的方法来处理动态内存分配。 #### 使用 heap_4.c 的配置 为了实现更灵活且安全的内存管理,在 `FreeRTOSConfig.h` 文件中定义宏 `configUSE_HEAP_SCHEME` 并设置为 4 来启用 heap_4 方案[^1]。heap_4 是一种支持多分区堆栈的方法,允许应用程序创建多个独立的内存池。 ```c #define configUSE_HEAP_SCHEME 4 /* Use heap_4 */ ``` #### 创建任务并申请内存 当初始化一个新任务时可以调用 `pvPortMalloc()` 函数请求一块指定大小的空间用于存储该任务的工作区数据结构体变量[^2]: ```c void StartDefaultTask(void const * argument){ char* message; // Allocate memory dynamically for the task's working area. void *pxMemory = pvPortMalloc( sizeof( StackType_t ) * configMINIMAL_STACK_SIZE ); if(pxMemory != NULL){ message = "Dynamic Memory Allocated Successfully"; while (1){ osDelay(500); HAL_UART_Transmit(&huart2, (uint8_t*)message, strlen(message), 100); } }else{ message = "Failed to allocate dynamic memory!"; HAL_UART_Transmit(&huart2, (uint8_t*)message, strlen(message), 100); } } ``` #### 安全释放不再使用的内存 一旦完成对某块已分配区域的操作之后应当及时通过 `vPortFree()` 将其返回给系统以便后续重用这些宝贵的 RAM 资源[^3]: ```c // When done with pxMemory... if(pxMemory != NULL){ vPortFree(pxMemory); } ``` #### 最佳实践建议 - 总是在成功获取到指针后再去访问它所指向的内容; - 频繁地执行 malloc/free 可能会引发碎片化问题,因此应尽可能减少这类操作次数; - 对于频繁变化的数据对象考虑采用静态声明方式代替动态分配策略;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值