好文档 - 专业文书写作范文服务资料分享网站

邝坚 - 北邮嵌入式实验报告 

天下 分享 时间: 加入收藏 我要投稿 点赞

semTake(semSynStart,WAIT_FOREVER); FOREVER { }

return (OK); }

/* timer(id)向客户端定时发送的定时器*/ STATUS timer(int id) {

……

semTake(semSynStart,WAIT_FOREVER); FOREVER { }

/*client(id)向服务器任务发请求消息*/ STATUS client(int id) {

……

semTake(semSynStart,WAIT_FOREVER); FOREVER { }

return (OK); }

4. 体现前次实验中实现的自定义内存管理机制,最大限度降低外部碎片对系统可靠性的威胁。

静态内存的数据结构为单链表,采用头插法,申请内存时,修改firstavailable另

其指向第二块,将firstavailable指向的头块取出,回收内存时,将回收的块的

frontBlock指向第一块,修改firstavailable另其指向回收的块,将回收的块作为第一块,数据结构如下所示:

……

……

}

return (OK);

……

poolpoolHeadnextfirstavailable blockHeadfrontBlockblockHeadfrontBlockblockHeadfrontBlockblockHeadpoolHeadfirstavailableblockHeadfrontBlockblockHeadfrontBlockblockHeadfrontBlockblockHead 静态分配了含有32个16B块的内存池和含有16个256B块的内存池,如果申请的内存大于256B,调用系统malloc。

/*initial() 初始化内存池*/ pool* initial(void) { int i; pool* mem; pool* poolPtr; poolHead* poolHeadPtr; blockHead* blockHeadPtr;

mem=(pool*)malloc(6000);/*分配6000B内存作为内存池*/

/*初始化pool*/ poolPtr = (pool*)mem; poolPtr->poolNum = 2;

poolPtr->pool = (poolHead*)((char*)mem + sizeof(pool)); /*pool指向申请内存区尾*/

/*初始化pool 1 该内存池分配大小为16B的内存*/

poolHeadPtr = (poolHead*)((char*)mem + sizeof(pool));/*初始化内存池的首地址*/

poolHeadPtr->available = 32; /*初始化可用块数32*/ poolHeadPtr->blockSize = 16; /*块大小16B*/

blockHeadPtr = (blockHead*)((char*)poolHeadPtr+sizeof(poolHead)); 初始化块的首地址*/

poolHeadPtr->firstavailable = blockHeadPtr; /*初始化第一块可用块的地址*/ poolHeadPtr->next= (poolHead*)((char*)poolHeadPtr + sizeof(poolHeadPtr)

/*

+ 32*(sizeof(blockHead)+16)); /*next指向第二个内存池 */

blockHeadPtr->poolId =1; blockHeadPtr->frontBlock = 0;

for(i=1;i<32;i++) /*将该内存池划分为32个容量16B的内存块*/ { 址*/

}

/*初始化pool 2 该内存池分配大小为256B的内存*/ poolHeadPtr = poolHeadPtr->next;

poolHeadPtr->available = 16; /*初始化可用块数16*/ poolHeadPtr->blockSize = 256; /*块大小256*/

blockHeadPtr = (blockHead*)((char*)poolHeadPtr+sizeof(poolHead));

poolHeadPtr->firstavailable = blockHeadPtr; poolHeadPtr->next = 0;

blockHeadPtr->poolId =2; blockHeadPtr->frontBlock = 0;

for(i=1;i<16;i++) /*将该内存池划分为16个容量256B的内存块*/ { }

return (pool*)mem; }

blockHeadPtr=(blockHead*)((char*)blockHeadPtr +

blockHeadPtr->poolId = 2; /* pool号为2,表示他是256B容量的*/ blockHeadPtr->frontBlock = poolHeadPtr->firstavailable; poolHeadPtr->firstavailable = blockHeadPtr;

(sizeof(blockHead)+256));

blockHeadPtr=(blockHead*)((char*)blockHeadPtr +

blockHeadPtr->poolId = 1; /* pool号为1,表示他是16B容量的*/ blockHeadPtr->frontBlock = poolHeadPtr->firstavailable; /* 当前首poolHeadPtr->firstavailable = blockHeadPtr; /* 求下一首个可用块地

(sizeof(blockHead)+16)); /*块的首址移动16加结构体的开销长度*/

个可用块地址赋给frontBlock */

/*memMalloc() 分配内存*/ void* memMalloc(int Size) {

void* mem;

poolHead* poolHeadPtr; blockHead* blockHeadPtr;

semTake(semMalloc,WAIT_FOREVER);

poolHeadPtr = initialPtr->pool;

if((Size <= 16)&&(poolHeadPtr->available != 0)) /*长度小于16时,分配长度为16的内存空间*/

{

blockHeadPtr = poolHeadPtr->firstavailable; /*首个可用块地址赋给poolHeadPtr->firstavailable = blockHeadPtr->frontBlock; /*改变下poolHeadPtr->available --; /*可用块数减一*/ semGive(semMalloc);

分配块的首地址*/ 一第一可用块的地址*/

return (void*)((char*)blockHeadPtr + sizeof(blockHead)); /*分配内存时加入块头开销*/

}

else if((Size <= 256)&&((poolHeadPtr->next)->available != 0)) { } else {

printf(\

/*其他情况用系统的内存分配函数malloc分配*/

blockHeadPtr = (poolHeadPtr->next)->firstavailable;

(poolHeadPtr->next)->firstavailable = blockHeadPtr->frontBlock; (poolHeadPtr->next)->available --; semGive(semMalloc);

return (void*)((char*)blockHeadPtr + sizeof(blockHead)); /*长度大于16小于256时,分配长度为256的内存空间*/

exhausted \\n\

} }

/*memFree() 释放内存空间*/ void memFree(void* dataPtr) {

char* mem= (char*) dataPtr; poolHead* poolHeadPtr; blockHead* blockHeadPtr;

semTake(semFree,WAIT_FOREVER);

poolHeadPtr = initialPtr->pool; /*恢复内存池首址*/

blockHeadPtr = (blockHead*)((char*)mem - sizeof(blockHead)); /*恢复内存块首址*/

if(blockHeadPtr->poolId == 1) /*释放16B的内存块*/ { */

}

else if(blockHeadPtr->poolId == 2)/*释放256B的内存块*/ { }

else /*释放由系统分配的内存块*/

blockHeadPtr->frontBlock = (poolHeadPtr->next)->firstavailable; (poolHeadPtr->next)->firstavailable = blockHeadPtr; (poolHeadPtr->next)->available ++; poolHeadPtr->available++; /*恢复可用块数*/

blockHeadPtr->frontBlock = poolHeadPtr->firstavailable; /*恢复poolHeadPtr->firstavailable = blockHeadPtr; /*恢复第一可用块地址

frontBlock地址*/

mem = malloc(Size); /*采用系统函数malloc()分配内存*/ blockHeadPtr = (blockHead*)mem;

blockHeadPtr->poolId = (initialPtr->poolNum +1); blockHeadPtr->frontBlock = mallocPtr; mallocPtr = blockHeadPtr; semGive(semMalloc);

return (void*)((char*)blockHeadPtr + sizeof(blockHead));

邝坚 - 北邮嵌入式实验报告 

semTake(semSynStart,WAIT_FOREVER);FOREVER{}return(OK);}/*timer(id)向客户端定时发送的定时器*/STATUStimer(intid){……semTake(semSynS
推荐度:
点击下载文档文档为doc格式
0dbon8nbiu0sr9y0o3kk
领取福利

微信扫码领取福利

微信扫码分享