ucos内存管理一OS_MEM *OSMemCreate(void*addr,INT32Unblks,INT32Ublksize,INT8U*err) {..............................................plink=(void**)addr; /*Createlinkedlistoffreememoryblocks当上述条件都得到满足时,所要建立的内存分区内的所有内存块链接成一个单向链表。这里之所以用单向链表,是因为在单向链表中插入和删除元素都是从链表的顶端开始向下执行的。内存区可使用静态二维数组或者在初始化时使用malloc()建立,因为malloc()返回值为void*所以这里是(void**)addr;其实此时plink里面存放的也是当前内存块的地址*/ pblk =(INT8U*)addr+blksize;/*pblk指向将被释放的内存控制块的指针。如果在此处不是很理解,请参看谭浩强C语言的多维数组与指针一节。其实此时pblk就是链表的下一个内存块的地址*/ for(i=0;i<(nblks-1);i++){ /*这里也体现了nblk应该大于等于2*/ *plink=(void*)pblk; /*在plink所指向的地址内存入指针pblk,这样此时这个plink指向的单元的头 四个字节中存入了链表的下一个内存块的地址。*/ plink =(void**)pblk; /*plink和pblk指向同一地址 (void**)pblk这样转换了类型但是pblk的 值并不改变,于是这样把pblk的值赋给了plink*/ pblk =pblk+blksize; /*指针pblk指向地址(plbk+blksize);这一段程序建立了一个内存分区,该内 。单联表的指针域在每个内存块的头四个字节内(一个指针占用四个字节).注意一个指针的大小决定于所用编译器TC运行在16位模拟器中所以指针大小是16位即2字节 而现在大多数编译器运行在32位模拟器中所以指针大小是32位即4字节。} .................................................................}c语言不够扎实,这是网上找的解说,看了好久貌似懂了。其实就是把pblk(一个地址)看成一个数,然后强制类型转换后赋给相应一级和二级指针,这样就形成了链表二void *OSMemGet(OS_MEM*pmem,INT8U*err) /*传递给OSMemGet()函数的参数中的指针pmem,它指向希望从中非配到内存块的内存分区。*/ {................................if(pmem->OSMemNFree>0){ /*Seeifthereareanyfreememoryblocks;OSMemGet()要检查内存分区中是否有空余的内存块。*/ pblk =pmem->OSMemFr
ucos 内存管理 来自淘豆网m.daumloan.com转载请标明出处.