微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 二维指针*(void **)的研究(uC/OS-II案例)

二维指针*(void **)的研究(uC/OS-II案例)

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

了把所指向的地址的内容转换成一个指针。

二、在OSMemGet( )函数内同样有一条强制转换为二维指针的指令:

void *pblk;

执行操作:pmem->OSMemFreeList =*(void **)pblk;

pblk被强制转换为二维指针,然后取出其内容*pblk,也就是pblk地址内存放的链接指针。

意味着取出pblk的内容,由于pblk被强制转换成了二维指针,所以它的内容就不是一般的值,而是一个指针(这个指针指向下一个Block首地址)。

三、在INT8U OSMemPut (OS_MEM *pmem, void *pblk) 函数内同样有类似的指令:

① *(void **)pblk = pmem->OSMemFreeList; // 将欲释放的块添加到空闲块链表最前面

② pmem->OSMemFreeList = pblk;

首先要明白pmem->OSMemFreeList是指向空闲块链表第一个block的首地址的。

语句①将pblk强制转换为二维指针后,再将pmem->OSMemFreeList赋值给pblk的内容(*pblk指针)。根据OSMemPut函数的定义,pblk是函数的形参,是欲释放的块的首地址。所以也就是将pmem->OSMemFreeList指针放入欲释放的块的首地址内,此处强制转换为二维指针的目的就是让欲释放的块的首地址内能存放指针。则这个块的首地址内的指针就是指向原先空闲块链表第一个Block的首地址的,也就是说这个块变成了空闲块链表第一个Block,实现了将释放的块添加到空闲块链表最前面的目的。

然后语句②更新pmem->OSMemFreeList指针,使其指向新释放的块的首地址,这样就保证了pmem->OSMemFreeList始终指向空闲块链表第一个Block首地址。

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

网站地图

Top