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;
}
[解决办法]
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);
}