首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

pmem->OSMemFreeList = *(void *)pblk;剧烈求解释!

2013-03-13 
pmem-OSMemFreeList *(void **)pblk强烈求解释!!!程序清单 L7.4 OSMemGet()void *OSMemGet (OS_MEM *p

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 的指针是可以被转换为其他类型的指针的。

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

热点排行