FreeRTOS内存管理-heap_3.c
1、简介
heap_3.c是5种内存管理中最简单的一个,它只是将malloc()与free()进行打包调用,heap_3.c与heap_1.c和heap_1.c不同的是:不再选择一个大的数组对内存进行分配和释放,即内存堆空间的大小不受configTOTAL_HEAP_SIZE的影响,而是选择由链接器分配相应的堆内存。
注意:
不可以直接引用malloc和free,因为标准库中的malloc和free也不能保证线程的安全性,因此,heap_3.c中的pvPortMalloc和vPortFree将其进行重新打包。
相关的函数接口:
- void *pvPortMalloc( size_t xWantedSize );
- void vPortFree( void *pv );
2、代码解析
2.1 内存分配
void *pvPortMalloc( size_t xWantedSize )
{
void *pvReturn;
/* 用vTaskSuspendAll()挂起所有的任务,以确保分配内存的过程是线程安全的。*/
vTaskSuspendAll();
{
pvReturn = malloc( xWantedSize );
traceMALLOC( pvReturn, xWantedSize );
}
( void ) xTaskResumeAll();
#if( configUSE_MALLOC_FAILED_HOOK == 1 )
{
if( pvReturn == NULL )
{
extern void vApplicationMallocFailedHook( void );
vApplicationMallocFailedHook();
}
}
#endif
/* 如果在FreeRTOS.h中设置了勾子函数宏,则在调用勾子函数vApplicationMallocFailedHook()之后再向用户返回分配内存的首地址。 */
return pvReturn;
}
2.2 内存释放
void vPortFree( void *pv )
{
if( pv )//检查指针的有效性
{
vTaskSuspendAll();
{
free( pv );//调用free()接口将内存回收
traceFREE( pv, 0 );
}
( void ) xTaskResumeAll();
}
}