freeRTOS内存释放问题vPortFree

vPortFree()内存释放函数,释放两次并不会报错。但是应当避免。

今天在看别人代码的时候,发现一个问题,在不同的地方把一个指针指向的内存释放了两次,但是程序运行是正常的。

虽然运行没出错误,但是程序的逻辑是有问题的。

所以我写了下面的语句测试了一下

vPortFree(pbuf);
vPortFree(pbuf);

发现确实不会导致程序运行出问题,但是写代码应当避免这种情况。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeRTOS内存的申请和释放是通过内置的动态内存管理函数来实现的。FreeRTOS 提供了两种内存管理方案:heap_1 和 heap_5。 heap_1 方案是最简单的内存管理方案,它只需要一个静态数组来存储内存。这个数组的大小是在编译时确定的,因此无法动态调整。heap_5 方案则需要使用操作系统提供的动态内存分配函数,例如 malloc() 和 free()。 在使用 FreeRTOS 动态内存管理函数时,需要注意以下几点: 1. 必须在任务创建之前初始化内存管理函数。 2. 内存申请和释放必须在同一任务中进行。 3. 如果使用 heap_1 方案,需要在内存申请前禁用任务调度。 4. 如果使用 heap_5 方案,需要配置操作系统的内存管理函数。 下面是 heap_1 方案内存申请和释放的示例代码: ``` /* 定义用于内存管理的静态数组 */ #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 10 * 1024 ) ) static uint8_t ucHeap[configTOTAL_HEAP_SIZE]; /* 初始化内存管理函数 */ void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) { /* 将静态数组作为内存区域注册 */ xHeapRegions = pxHeapRegions; xHeapRegions[0].pucStartAddress = ucHeap; xHeapRegions[0].xSizeInBytes = configTOTAL_HEAP_SIZE; } /* 内存申请 */ void *pvPortMalloc( size_t xWantedSize ) { void *pvReturn; /* 禁用任务调度 */ vTaskSuspendAll(); /* 调用内存管理函数进行内存申请 */ pvReturn = prvHeapMalloc( xWantedSize ); /* 恢复任务调度 */ xTaskResumeAll(); return pvReturn; } /* 内存释放 */ void vPortFree( void *pv ) { /* 禁用任务调度 */ vTaskSuspendAll(); /* 调用内存管理函数进行内存释放 */ vHeapFree( pv ); /* 恢复任务调度 */ xTaskResumeAll(); } ``` 注意,在使用 heap_1 方案时,需要调用 vPortDefineHeapRegions() 函数注册内存区域。在内存申请前需要禁用任务调度,以避免多个任务同时申请内存导致冲突。在内存释放后需要恢复任务调度。 使用 heap_5 方案时,需要在 FreeRTOS 中配置操作系统的内存管理函数。配置方法可以参考官方文档:https://www.freertos.org/a00111.html。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值