ucosii内存结构

ucosii内存管理

1、OS_MemInit

初始化OSMemFreeList列表,将OSMemTbl数组链接成OS_MEM的链,即分成若干分区。后续OSMemCreate使用时从这个链中选取空闲分区free memorypartition。

pmem = OSMemFreeList;

2、OSMemCreate

源码较晦涩,跟踪一下会比较直观,利于理解。下图是调试图。


这里创建了两块内存,intBuffer1和IntBuffer2.

OSMemFreeList起始地址为0x2000452c,在创建完两个内存分区后,OSMemFreeList增加到0x2000455c,其中OSMemFreeList每个元素占用24字节。

而内存区,从0x200016F8开始,这里64字节一个block,可以看到,每个block的起始四字节是next block的地址。这也是OSMemCreate函数中那段代码的作用。

    plink = (void **)addr;                           /* Createlinked list of free memory blocks      */
    pblk  = (INT8U *)addr;
    loops  = nblks - 1u;
    for (i = 0u; i < loops; i++) {
        pblk +=  blksize;                            /* Pointto the FOLLOWING block                 */
       *plink = (void  *)pblk;                       /* Save pointerto NEXT block in CURRENT block   */
        plink = (void **)pblk;                       /* Position to NEXT      block                 */
    }
    *plink              = (void*)0;                  /* Lastmemory block points to NULL              */

3、OSMemGet        

        pblk               = pmem->OSMemFreeList;    /* Yes, pointto next free memory block          */
        pmem->OSMemFreeList = *(void **)pblk;        /*      Adjust pointer to new free list         */

pblk=0x200016B8 

pmem->OSMemFreeList = *pblk = 0x200016F8  是0x200016B8内存储的数据,即0x200016F8,将free指针指向下一块内存

4、OSMemPut

与OSMemGet相反,这里是将pmem->freelist指针向前移,同时将本块前四字节置成刚才的pmem->freelist地址。

    *(void **)pblk      = pmem->OSMemFreeList;   /* Insert released block into free blocklist         */

    pmem->OSMemFreeList =pblk;

总结,内存结构图:



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值