欢迎来到天天文库
浏览记录
ID:55281841
大小:82.00 KB
页数:13页
时间:2020-05-09
《嵌入式操作系统内核原理和开发(改进的链表内存分配算法).doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、嵌入式操作系统内核原理和开发(改进的链表内存分配算法)之前我自己也写过基于链表的内存分配算法,但是看了rawos的内存分配算法,还是感觉rawos写的要更好些。大家都知道,链表内存分配就是从链表中快速找到最合适的内存块分配给用户线程。因为这种分配是随机的,所以一般来说内存碎片是不可避免的。但是,我们在编写代码的时候还是应该注意内存合并的问题。这里我们为什么要介绍rawos的内存分配呢,还包括有这么几个原因,(1)整个内存链表采用循环链表的方法,使用起来简单可靠;(2)内存分配的时候所有节点都是连在一起的,通过标志数据判断当前数据是否已经分配;(3)如果当前没有合适
2、的内存,可以选择等待;(4)代码充分考虑了合并和切分的问题;(5)在遍历内存的时候灵活处理了中断问题,可以及时响应中断,这个比我考虑得要周到很多;(6)代码注释丰富,只要多读几遍,是可以慢慢理解代码内容的。整个代码的结构清晰,共四个函数,分别是创建函数、内存查找函数、内存分配函数、内存释放函数。其中在内存分配和释放的时候,都会调用到内存查找函数。[cpp]viewplaincopy1RAW_U16raw_byte_pool_create(RAW_BYTE_POOL_STRUCT*pool_ptr,RAW_U8*name_ptr,RAW_VOID*pool_star
3、t,RAW_U32pool_size)2{34RAW_U8*block_ptr;/*Workingblockpointer*/5RAW_U8byte_align_mask;67#if(RAW_BYTE_FUNCTION_CHECK>0)89if(pool_ptr==0){1011returnRAW_NULL_POINTER;12}1314if(pool_start==0){151returnRAW_NULL_POINTER;2}34/*Checkforinvalidpoolsize.*/5if(pool_size4、rnRAW_BYTE_SIZE_ERROR;89}1011#endif1213byte_align_mask=sizeof(void*)-1u;1415/*pool_startneeds4bytesaligned*/16if(((RAW_U32)pool_start&byte_align_mask)){1718returnRAW_INVALID_ALIGN;1920}2122/*pool_sizeneeds4bytesaligned*/23if((pool_size&byte_align_mask)){2425returnRAW_INVALID_ALIGN;26}5、2728/*Initthelist*/29list_init(&pool_ptr->common_block_obj.block_list);3031/*Setupthebasicbytepoolfields.*/32pool_ptr->common_block_obj.name=name_ptr;33pool_ptr->common_block_obj.block_way=0;34pool_ptr->raw_byte_pool_search=(RAW_U8*)pool_start;35pool_ptr->raw_byte_pool_owner=0;3637/*I6、nitially,thepoolwillhavetwoblocks.Onelargeblockatthe38beginningthatisavailableandasmallallocatedblockattheend39ofthepoolthatistherejustforthealgorithm.Besuretocount40theavailableblock'sheaderintheavailablebytescount.*/41pool_ptr->raw_byte_pool_available=pool_size-sizeof(void*)-sizeof(7、RAW_U32);42pool_ptr->raw_byte_pool_fragments=2;431/*Calculatetheendofthepool'smemoryarea.*/2block_ptr=((RAW_U8*)pool_start)+(RAW_U32)pool_size;34/*Backuptheendofthepoolpointerandbuildthepre-allocatedblock.*/5block_ptr=block_ptr-sizeof(RAW_U32);6*((RAW_U32*)block_ptr)=RAW_BYTE_BLOCK_AL8、LOC;7
4、rnRAW_BYTE_SIZE_ERROR;89}1011#endif1213byte_align_mask=sizeof(void*)-1u;1415/*pool_startneeds4bytesaligned*/16if(((RAW_U32)pool_start&byte_align_mask)){1718returnRAW_INVALID_ALIGN;1920}2122/*pool_sizeneeds4bytesaligned*/23if((pool_size&byte_align_mask)){2425returnRAW_INVALID_ALIGN;26}
5、2728/*Initthelist*/29list_init(&pool_ptr->common_block_obj.block_list);3031/*Setupthebasicbytepoolfields.*/32pool_ptr->common_block_obj.name=name_ptr;33pool_ptr->common_block_obj.block_way=0;34pool_ptr->raw_byte_pool_search=(RAW_U8*)pool_start;35pool_ptr->raw_byte_pool_owner=0;3637/*I
6、nitially,thepoolwillhavetwoblocks.Onelargeblockatthe38beginningthatisavailableandasmallallocatedblockattheend39ofthepoolthatistherejustforthealgorithm.Besuretocount40theavailableblock'sheaderintheavailablebytescount.*/41pool_ptr->raw_byte_pool_available=pool_size-sizeof(void*)-sizeof(
7、RAW_U32);42pool_ptr->raw_byte_pool_fragments=2;431/*Calculatetheendofthepool'smemoryarea.*/2block_ptr=((RAW_U8*)pool_start)+(RAW_U32)pool_size;34/*Backuptheendofthepoolpointerandbuildthepre-allocatedblock.*/5block_ptr=block_ptr-sizeof(RAW_U32);6*((RAW_U32*)block_ptr)=RAW_BYTE_BLOCK_AL
8、LOC;7
此文档下载收益归作者所有