欢迎来到天天文库
浏览记录
ID:61499527
大小:48.50 KB
页数:7页
时间:2021-02-07
《嵌入式操作系统内核原理和开发(等值block内存池设计).doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、嵌入式操作系统内核原理和开发(等值block内存池设计)内存池设计是嵌入式系统的一个重要环节,之前我们也讨论过相关的内容。但是,看了rawos的代码之后,我觉得rawos的内存池设计更有特点。整个内存池的设计非常健壮,不但考虑了字节对齐的问题,而且还引入了等待调度机制,这是我所没有想到的。所以,在此我很愿意和大家分享这份优秀的代码。闲话不多说,我们看看rawos的mempool数据结构是什么样的,[cpp]viewplaincopy1typedefstructMEM_POOL2{3RAW_COMMON_BLOCK_OBJECTcommon_block_obj;45/*Def
2、inethenumberofavailablememoryblocksinthepool.*/6RAW_U32raw_block_pool_available;78/*Definetheheadpointeroftheavailableblockpool.*/9RAW_U8*raw_block_pool_available_list;1011}MEM_POOL;12内存池的结构非常简单,主要包括了通用阻塞结构、block数值,block起始指针。内存池下面可以包括若干个block,每个block的大小都是相等的,同时block之间是通过链表串联在一起的,这个我们看了后面的代
3、码就明白了。mempool的处理函数不多,就三个,初始化、申请、释放函数。[cpp]viewplaincopy13RAW_U16raw_block_pool_create(MEM_POOL*pool_ptr,RAW_U8*name_ptr,RAW_U32block_size,RAW_VOID*pool_start,RAW_U32pool_size)14{1516//MEM_POOL*tail_ptr;/*Workingblockpoolpointer*/17RAW_U32blocks;/*Numberofblocksinpool*/18RAW_U8*block_ptr;/*
4、Workingblockpointer*/19RAW_U8*next_block_ptr;/*Nextblockpointer*/20RAW_U8*end_of_pool;/*Endofpoolarea*/21RAW_U8block_align_mask;2223#if(RAW_BLOCK_FUNCTION_CHECK>0)24/*Checkforinvalidpoolsize.*/251if(pool_size<(block_size+block_size)){23returnRAW_BLOCK_SIZE_ERROR;4}56if(pool_ptr==0){78retur
5、nRAW_NULL_OBJECT;9}1011if(pool_start==0){1213returnRAW_NULL_POINTER;14}1516#endif1718block_align_mask=sizeof(void*)-1u;1920if(((RAW_U32)pool_start&block_align_mask)){2122returnRAW_INVALID_ALIGN;2324}2526if((pool_size&block_align_mask)){2728returnRAW_INVALID_ALIGN;29}3031if((block_size&bloc
6、k_align_mask)){3233returnRAW_INVALID_ALIGN;34}3536/*Initthelist*/37list_init(&pool_ptr->common_block_obj.block_list);3839/*Setupthebasicblockpoolfields.*/40pool_ptr->common_block_obj.name=name_ptr;41pool_ptr->common_block_obj.block_way=0;4243/*Calculatetheendofthepool'smemoryarea.*/44end_o
7、f_pool=(RAW_U8*)pool_start+pool_size;12/*Walkthroughthepoolarea,settinguptheavailableblocklist.*/3blocks=0;4block_ptr=(RAW_U8*)pool_start;5next_block_ptr=block_ptr+block_size;67while(next_block_ptr<=end_of_pool){89blocks++;1011if(next_block_ptr==end_of_pool){1
此文档下载收益归作者所有