ucos 内存管理.doc

上传人:大张伟 文档编号:7217599 上传时间:2020-11-06 格式:DOC 页数:4 大小:27.51KB
返回 下载 相关 举报
ucos 内存管理.doc_第1页
第1页 / 共4页
ucos 内存管理.doc_第2页
第2页 / 共4页
ucos 内存管理.doc_第3页
第3页 / 共4页
ucos 内存管理.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《ucos 内存管理.doc》由会员分享,可在线阅读,更多相关《ucos 内存管理.doc(4页珍藏版)》请在三一文库上搜索。

1、ucos 内存管理 一OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err) .plink = (void *)addr;/* Create linked list of free memory blocks当上述条件都得到满足时,所要建立的内存分区内的所有内存块链接成一个单向链表。这里之所以用单向链表,是因为在单向链表中插入和删除元素都是从链表的 顶端开始向下执行的。内存区可使用静态二维数组或者在初始化时使用malloc()建立,因为malloc()返回值为void*所以这里是 (void *)ad

2、dr;其实此时plink里面存放的也是当前内存块的地址*/pblk = (INT8U *)addr + blksize; /*pblk指向将被释放的内存控制块的指针。如果在此处不是很理解,请参看谭浩强C语言的多维数组与指针一节。其实此时pblk就是链表的下一个内存块的地址*/for (i = 0; i OSMemNFree 0) /* See if there are any free memory blocks;OSMemGet()要检查内存分区中是否有空余的内存块。*/ pblk = pmem-OSMemFreeList;/* Yes, point to next free memory

3、block如果有空余内存块,那么其中第 1个内存块会从空余内存块链表中被删除*/pmem-OSMemFreeList = *(void *)pblk;/* Adjust pointer to new free list此处为什么要用*(void *)pblk 的形式 网上众说纷纭,其实我觉的很简单,因为OSMemFreeList在定义的时候就定义成了void* 见UCOS_II.H文件 这里纯粹就是 为了统一类型作的强制转换类型而已,是一种编程的好习惯。当然还是应该格外注意void*的用法。*/ pmem-OSMemNFree-;/* One less memory block in this

4、 partition空余内存块链表会被更新,包括将链表头指针后移一个元素和将空余内存块数减一。*/ OS_EXIT_CRITICAL(); *err = OS_NO_ERR;return (pblk);/* Return memory block to caller将指向已分配的内存块的指针返回给用户程序。*/ .以上是从网上找的,加点我对红色部分的理解:第一句:pmem-OSMemFreeList也指向空闲链表的起始地址,把这个起始赋给pblk第二句:即把pmem-OSMemFreeList(也即pblk)指向的地址中的内容(即下一内存块的地址)赋给pmem-OSMemFreeList难点就

5、是 要搞清 地址 和地址中存的内容,即二级指针方面以上内容转自http:/ main()int *SinglePt;int *DoublePt;int a108;int i=1,k;for(int j=0;j10;j+)for(int g=0;g8;g+) ajg=i+; coutajg=&ajgendl;coutendlendl(1)SinglePt = (int *)a+8 ;/-(2)coutDoublePt= = DoublePtendl;cout*DoublePt= = *DoublePtendl;/cout*(*DoublePt?= = *(*DoublePt)endl; cout

6、SinglePt= = SinglePtendl;cout*SinglePt= = *SinglePtendl;coutendlendl; for(k=0;k(3) coutDoublePt = DoublePtendl; cout*DoublePt = *DoublePtendl; cout*(int*)DoublePt = *(int*)DoublePt(4) coutDoublePt = DoublePtendl; cout*DoublePt = *DoublePt(5) coutendlinitional 3) ditto 0xFE58(Same1) 9(Same11) ditto(s

7、ame2) ditto(same22) ditto/here have evaluated for next point 4) 0xFE58(same2) 9(same22) X ditto ditto ditto/here have moved the point5) ditto ditto ditto 0xFE78(Same3) 17(Same33) X /here add the varible for next point-Result 0xFE58 9 X 0xFE78 17 X 3) ditto 0xff78(same3) 17(same33) ditto ditto ditto4) 0xff78 17 X ditto ditto ditto5) ditto ditto ditto 0xff98 25 x 没有理解的原因是,误解了ucos内存管理,以为内存管理只是简单的在数组内部进行管理,其实不是,该内存管理可以用malloc申请,这种只是借他们来得到系统的内存单元,得到后只用首地址和大小,并不用数组中的段,每一个内存段的管理都要使用内存前面的一个指针域,用于链表的连接.创建内存空间后的内系统应该如下图.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1