目录
基于freertos的嵌入式系统开发(五)FreeRTOS的内存管理方法3
简介
在freertos的内存分配方法3中, pvPortMalloc() 和 vPortFree() 的实现是基于 malloc()和 free()实现的,与方法c和2不同的是:不再选择一个大的数组对内存进行分配和释放,也就是说内存堆空间的大小不受configTOTAL_HEAP_SIZE的影响,而是选择由链接器分配相应的堆内存。需要注意的是,因为标准库中的malloc和free不能保证线程的安全性,在heap_3.c中,将标准函数的malloc()和free()函数封装,使其具有线程保护功能。所以需要pvPortMalloc和vPortFree对其进行重新封装。heap_3.c是5种内存管理中最简单的,下面就其代码进行详细分析。
内存分配函数void * pvPortMalloc( size_t xWantedSize )
pvPortMalloc()的所有代码,很短,也很容易理解。首先,用vTaskSuspendAll()挂起所有的任务,以确保分配内存的过程是线程安全的。接下来才使用malloc()进行内存分配。然后就是调用调试信息宏traceMALLOC(),接着调用xTaskResumeAll()恢复被挂起的任务。分配内存流程就结束了。如果在FreeRTOS.h中设置了勾子函数宏,则在调用勾子函数
vApplicationMallocFailedHook()
最后返回分配内存的首地址,代码实现如下:
void * pvPortMalloc( size_t xWantedSize )
{
void * pvReturn;
vTaskSuspendAll(); //挂起所以task,确保分配内存的过程是线程安全的。
{
pvReturn = malloc( xWantedSize );
traceMALLOC( pvReturn, xWantedSize );
}
( void ) xTaskResumeAll();//恢复所以task
#if ( configUSE_MALLOC_FAILED_HOOK == 1 ) //分配失败钩子函数处理
{
if( pvReturn == NULL )
{
extern void vApplicationMallocFailedHook( void );
vApplicationMallocFailedHook();
}
}
#endif
return pvReturn;
}
内存释放函数void vPortFree( void * pv )
实现代码如下:
void vPortFree( void * pv )
{
if( pv )
{
vTaskSuspendAll(); //挂起所以task
{
free( pv );
traceFREE( pv, 0 );
}
( void ) xTaskResumeAll();//恢复所以task
}
}