• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

询问高手关于uc/os中内存建立分区 [

电子大拿 2016-11-15 浏览量:875
在建立内存分区OSMEMCreat()中
有这么一段代码
pmem=OSMEMFreeList;
if(OSMemFreeList!=(OS_MEM*)0){
    OSMemFreeList=(OS_MEM*)OSMEMFreeList->OSMEMFreeList;
}
请问
OSMemFreeList=(OS_MEM*)OSMEMFreeList->OSMEMFreeList
是代表什么意思?
按理说中间那个OSMEMFreeList应该是指向OS_MEM块的指针,可是和后面的 -> 这个符号就对应不上了。
高手给解释一下这三个OSMemFreeList各代表什么意思。
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • //OSMemFreeList指向“空闲内存块结构体”指针,以下简写为list

    //你不要弄混,下句中这个list是全局变量,它和OS_MEM的成员list是重名的。

    pmem=OSMemFreeList

    /* 

    这句就是获取“空闲内存块”,准备用它建立一个动态内存分区,

    由于要使用这个“空闲内存块”,所以list指向的“空闲内存块”将不再是“空闲”的了。

    那么就要把list重新指向另一个“空闲内存块”,也就是链表中的下一个。

    这样程序其它地方才能再调用OSMemCreat获得一个空闲内存块来建立其它内存分区。

    */

    /*要更新list,让它指向链表下一个“空闲内存块”,就是下面的代码要做的*/

    if(OSMemFreeList!=(OS_MEM*)0){

        OSMemFreeList=(OS_MEM*)OSMemFreeList->OSMemFreeList
    }

    /*

    按你的说法:

    第一个list是全局变量,我们要把它更新,使其指向“空闲内存块链表”中下一个内存块。

    而链表中下一个“空闲内存块”的地址,就是保存在   “当前准备要使用的的内存块”   的成员list”里。

    所以:

    全局变量list = 当前空白内存块结构体中的list;

    */

    • 发布于 2016-11-16
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:3
电子大拿 回复了 zhangsf_chongzai :看了还是不太懂 回复

  • 嗨,ˊ這個是Linked list的觀念喔,首先在執行OSMemInit()之後,OSMemFreeList整體鏈結圖如下,

    當您執行OSMEMCreat()時,因為當前的List pointer已經由pmem=OSMEMFreeList;獲得

    因此OSMemFreeList=(OS_MEM*)OSMEMFreeList->OSMEMFreeList;用來將當前OSMemFreeList pointer指向下一個未使用的OSMemFreeList的位址

    所以OSMEMCreat()後,OS可用記憶體區塊就會是如下圖

    這很清楚地描述連續的記憶體空間如何被切割成數個區塊(Block),以上希望對您有用

    • 发布于2016-11-15
    • 举报
    • 评论 0
    • 0
    • 0

  • 会员你好,有了答案要及时选择最佳答案,别忘了哦
    • 发布于2016-11-22
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

询问高手关于uc/os中内存建立分区 [