首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

浅析FreeRTOS_v4.5.0内存分配与回收及其改进方案(4)

浅析FreeRTOS_v4.5.0内存分配与回收及其改进方案(4)

<2.2>第2种动态内存回收
void vPortFree( void *pv )
{
unsigned portCHAR *puc = ( unsigned portCHAR * ) pv;
xBlockLink *pxLink;
    if( pv )
    {
        puc -= heapSTRUCT_SIZE;//内存数据区的前heapSTRUCT_SIZE空间存放了管理本段内存数据区的控制数据
        pxLink = ( void * ) puc;
        vTaskSuspendAll();//锁住调度器
        {
//把释放出来的内存块添加到空闲内存链表xStart~xEnd之间
//(注:xStart~xEnd是按空闲内存大小,以从小到达的顺序链起来的单向链表[gliethttp])
//也就是这样虽然看上去,FreeRTOS可以实现各种内存块的申请,但是因为切割出去的小内存块
//在内存释放回收的时候,并不能自动进行内存合并整理,也就是空闲内存块不能变大,
//最后只能导致小内存空闲块越来越多,大内存空闲块越来越少,直到不能申请到大内存块
//可以使用《一种轻巧的“内存动态分配管理机制”》中的方法很好的解决(gliethttp)
//文章地址:http://blog.chinaunix.net/u1/38994/showart_351550.html
            prvInsertBlockIntoFreeList( ( ( xBlockLink * ) pxLink ) );
        }
//调度器解锁,此间会有若干处理,详细细节可以参见《浅析FreeRTOS_v4.5.0延时机制---vTaskDelay()的实现》
//文章地址:http://blog.chinaunix.net/u1/38994/showart_392389.html
        xTaskResumeAll();
    }
}
//------------------------------------------------------------------------------
<3.1>第3种内存动态分配
void *pvPortMalloc( size_t xWantedSize )
{
void *pvReturn;

    vTaskSuspendAll();
    {
        pvReturn = malloc( xWantedSize );//使用编译器自带的malloc函数
    }
    xTaskResumeAll();

    return pvReturn;
}
<3.2>第3种动态内存回收
void vPortFree( void *pv )
{
    if( pv )
    {
        vTaskSuspendAll();
        {
            free( pv );//使用编译器自带的free函数
        }
        xTaskResumeAll();
    }
}
//------------------------------------------------------------------------------
  综上可知,FreeRTOS_v4.5.0对内存的动态分配支持的并不好,内存动态分配很简单,分配出去就可以了,
但是在分配出去的内存的动态回收上,还是欠佳的,可以引入linux中的Buddy伙伴算法,就是可能麻烦一些,
继承事业,薪火相传
返回列表