嵌入式操作系统内核原理和开发(改进的链表内存分配算法).doc

嵌入式操作系统内核原理和开发(改进的链表内存分配算法).doc

ID:55281841

大小:82.00 KB

页数:13页

时间:2020-05-09

嵌入式操作系统内核原理和开发(改进的链表内存分配算法).doc_第1页
嵌入式操作系统内核原理和开发(改进的链表内存分配算法).doc_第2页
嵌入式操作系统内核原理和开发(改进的链表内存分配算法).doc_第3页
嵌入式操作系统内核原理和开发(改进的链表内存分配算法).doc_第4页
嵌入式操作系统内核原理和开发(改进的链表内存分配算法).doc_第5页
资源描述:

《嵌入式操作系统内核原理和开发(改进的链表内存分配算法).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_size

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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。