微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > UC/OS-II的内存管理OSMemCreate()分析

UC/OS-II的内存管理OSMemCreate()分析

时间:12-01 来源:互联网 点击:

上面的代码大致的意思就是完成内存块的链接以及内存分区控制单元的初始化操作,但是有几句代码存在一定的理解难度。

plink = (void **)addr; /* Create linked list of free memory blocks */
pblk = (INT8U *)addr + blksize;
for (i = 0; i < (nblks - 1); i++) {
*plink = (void *)pblk;
plink = (void **)pblk;
pblk = pblk + blksize;
}
*plink = (void *)0; /* Lastmemoryblockpoints to NULL */

下面几句代码中存在大量的强制类型转换,我们一句一句的分析,plink=(void**)addr的意思是将传递进来的地址强制转换,原因是因为plink是一个存储在函数栈中的变量,它指向了addr指向的地址,而该地址处将来存储的也是一个地址,因此可以看做二维指针,而addr只是一维指针,因此需要强制类型转换为二维指针。

引用:在声明的时候,plink是二维指针,在这里将addr强制的转换成二维指针再赋值给plink的原因是:让addr以前指向的内容让编译器解释成地址,也就是一个指针,如果不做这个强制转换,以前addr指向的内容就不是一个地址,也就是不是指针,在这个函数当中,我们想把addr指向的二维数组,分割成大小相同的若干块,就必须用指针把它们链接起来,所以将addr强制转换成二维指针,然后赋值给plink,然后让plink去执行连接的操作,也就是在以前addr指向的地方放上指针;plink本身是存放在栈上的,plink这个符号的值是指向addr的,*plink就是取plink指向地址单元的内容,而 plink指向地址单元的内容是一个地址,即是一个指针,plink指向地址单元的内容也就是addr指向地址单元的内容,但由于addr是一维指针,所以它指向的内容不会被解释成一个地址,而是一般的内容。现在*plink就是把addr所在存储单元的内容解释成一个指针,并且将下一个block的首地址赋值给此存储单元,理解了这点就可以理解下面的源代码了,同时对C里面指针的概念又有了进一步的认识。http://blog.csdn.net/uestczhangchao/article/details/5589476

pblk=(INT8U*)addr+blksize;这句代码其中暗含了我们对指针加减操作的基本理解,因为在uc/OS-II中是按照字节作为内存块分布的,所以进行了INT8U*的强制类型转换,因为只有这样才能保证addr+blksize的操作是增加多少个字节的数据。因为C语言中指针的加减是与其指向的类型的内存空间密切相关的,比如int * p = 0; p ++;此时的p = 4;而当char *p = 0; p ++; 此时的p = 1;这就说明了指针的加减必须注意数据的类型,而不能直接对void*类型的指针进行加减操作。

*plink=(void*)pblk;因为plink是一个栈中变量,而对plink取进行解引用,实际上就是得到addr的值,但是*plink是一个地址,还是一个指针,因此需要强制类型转换。

plink=(void**)pblk;上面的代码已经分析。

基本的思想就是需要注意常数转换为指针的方式方法:int* p = (int *)0x45342341;int **p = (int **)0x45342341;指针的引入主要就是为了解决内存问题,因此对内存的管理直接体现了对指针的理解深度。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top