基于freertos的嵌入式系统开发(五)FreeRTOS的内存管理方法3

34 篇文章 3 订阅
33 篇文章 2 订阅

基于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
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyjbj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值