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

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

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

if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )
                {
//#define heapMINIMUM_BLOCK_SIZE    ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) )
//如果本pxBlock剩余的字节数大于heapMINIMUM_BLOCK_SIZE,即:还可以用来申请heapSTRUCT_SIZE个字节数据
                    //那么切割本pxBlock内存块(注意:xWantedSize是已经包含heapSTRUCT_SIZE的了[gliethttp])
                    //pxNewBlockLink为切割出来的新的空闲内存块首地址,已经4字节对齐
                    pxNewBlockLink = ( void * ) ( ( ( unsigned portCHAR * ) pxBlock ) + xWantedSize );
                    //计算新空闲内存块包括heapSTRUCT_SIZE控制域和数据域的总大小
                    pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;   
                    pxBlock->xBlockSize = xWantedSize;//将申请到的内存块的大小,填入内存块控制域
                    //把切割出来的内存块添加到空闲内存链表xStart~xEnd之间
                    //(注:xStart~xEnd是按空闲内存大小,以从小到达的顺序链起来的单向链表[gliethttp])
                    //也就是这样虽然看上去,FreeRTOS可以实现各种内存块的申请,但是因为切割出去的小内存块
                    //在内存释放回收的时候,并不能自动进行内存合并整理,也就是空闲内存块不能变大,
                    //最后只能导致小内存空闲块越来越多,大内存空闲块越来越少,直到不能申请到大内存块
                    //可以使用《一种轻巧的“内存动态分配管理机制”》中的方法很好的解决(gliethttp)
                    //文章地址:http://blog.chinaunix.net/u1/38994/showart_351550.html
                    prvInsertBlockIntoFreeList( ( pxNewBlockLink ) );
                }
            }
        }
    }
//调度器解锁,此间会有若干处理,详细细节可以参见《浅析FreeRTOS_v4.5.0延时机制---vTaskDelay()的实现》
//文章地址:http://blog.chinaunix.net/u1/38994/showart_392389.html
    xTaskResumeAll();

    return pvReturn;//返回申请到的内存数据区地址,pvReturn-heapSTRUCT_SIZE处存放了管理该pvReturn内存的控制数据
}
继承事业,薪火相传
返回列表