读书人

pmem-gt;OSMemFreeList = *(void *)pblk

发布时间: 2013-03-13 10:56:58 作者: rapoo

pmem->OSMemFreeList = *(void **)pblk;强烈求解释!!!
程序清单 L7.4 OSMemGet()
void *OSMemGet (OS_MEM *pmem, INT8U *err) (1)
{
void *pblk;
OS_ENTER_CRITICAL();
if (pmem->OSMemNFree > 0) { (2)
pblk = pmem->OSMemFreeList; (3)
pmem->OSMemFreeList = *(void **)pblk; (4)
pmem->OSMemNFree--; (5)
OS_EXIT_CRITICAL();
*err = OS_NO_ERR;
return (pblk); (6)
} else {
OS_EXIT_CRITICAL();
*err = OS_MEM_NO_FREE_BLKS;
return ((void *)0);
}
}
看过ucos内核代码的人都知道,这是ucos的内存块获取函数。由于小女子c语言所学不精,对于(4)一时理解不了,恳请各位大侠指点迷津,再次感谢!!!
[解决办法]
举个例子

typedef struct tagLIST_ITEM
{
struct tagLIST_ITEM *pnext;
.....
}LIST_ITEM;

LIST_ITEM *pListHead;
LIST_ITEM ListItem1, ListItem2;
// 初始化
void ListInit(void)
{
pListHead = &ListItem1;
pListHead->pnext = &ListItem2;
ListItem2->pnext = NULL;
}
// 从链表头摘下一项
LIST_ITEM *ListGetHeadItem(void)
{
LIST_ITEM *pitem;
pitem = pListHead;
if(pListHead)
{
pListHead = pitem->pnext;
}
return pitem;
}

上面的这个你看懂了吧,下面换个形式实现ListGetHeadItem

// 从链表头摘下一项
LIST_ITEM *ListGetHeatItem(void)
{
void *pitem;
pitem = pListHead;
if(pListHead)
{
pListHead = *(void **)pitem;
}
return pitem;
}






[解决办法]

引用:
这个操作是针对链表的。在(3)中,将pmem->OSMemFreeList的地址给了pblk ,然后pmem->OSMemFreeList应该修改它的地址了,所以就有了*(void **)pblk。

首先(void **)pblk是一个指向void类型的指针,而*(void **)pblk就是该指针指向的数值。而void *pblk。。。。。。。写不下去了,请大侠求解。。。


void *OSMemGet (OS_MEM *pmem, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
void *pblk;


#if OS_ARG_CHK_EN > 0
if (pmem == (OS_MEM *)0)
{
*err = OS_MEM_INVALID_PMEM;
return ((OS_MEM *)0);
}
#endif

OS_ENTER_CRITICAL();
if (pmem->OSMemNFree > 0) /* 是否还有空闲的内存块 */
{


pblk= pmem->OSMemFreeList; /* 取得链表头一个内存块节点 */
pmem->OSMemFreeList = *(void **)pblk; /* 指向下一个 内存块的头指针*/
pmem->OSMemNFree--; /* 剩余的内存块减少一 */
OS_EXIT_CRITICAL();
*err = OS_NO_ERR; /* 没有错误 */
return (pblk); /* 返回这个内存块的首地址 */
}

OS_EXIT_CRITICAL();
*err = OS_MEM_NO_FREE_BLKS;
return ((void *)0);
}


[解决办法]
详细信息可参考ucos-ii 中文书(邵贝贝)第7章

[解决办法]
μC/OS-II内存管理

ucos II 内存动态管理 mem.c文件

OS_MEM.C

[解决办法]
感觉你要是这样用:
pmem->OSMemFreeList = pblk;
也不会错。 void 的指针是可以被转换为其他类型的指针的。

这样的用法可能是为了形式上的统一,后面还有与此有关的代码,会有特别的需求吧。

读书人网 >单片机

热点推荐