zoukankan      html  css  js  c++  java
  • ucos的动态内存管理

        动态内存管理是ucos中相对比较简单好理解的,就拿来先写了。

        如果你用"INT8U mem[8][6];"创建了一个二维数组,其实就是创建了一个内存分区(PARTITION),其中它有8个块(block),每个块的空间都是一样的,6个字节。ucos对内存分区进行管理,task按照内存块为单位进行内存空间的申请。但是如果只有只有这样单纯的空间,没有管理,就无所谓动态内存管理了。所以有了内存控制

    块。

        内存控制块就如同任务的TCB,在系统初始化的时候就调用OS_MemInit,这个函数定义并初始化这样一个链表,如下图所示。当一个程序申请一个内存分区的时候,就会从这个表中摘取一个内存控制块。

        内存控制块有如下信息:

    typedef struct os_mem {                   /* MEMORY CONTROL BLOCK      */
        void   *OSMemAddr;                    /* 内存分区指针           */
        void   *OSMemFreeList;                /* 内存控制块链表指针       */
        INT32U  OSMemBlkSize;                 /* 块的大小               */
        INT32U  OSMemNBlks;                   /* 块的数量            */
        INT32U  OSMemNFree;                   /* 剩余的块数量      */
    #if OS_MEM_NAME_EN > 0u
        INT8U  *OSMemName;                    /* 分区名字         */
    #endif
    } OS_MEM;

        动态内存的概念性介绍就到这里为止了。下面是用到的几个函数:

    OS_MEM *OSMemCreate (void *addr,INT32U nblks,INT32U blksize,INT8U *perr)

    创建一个分区

    void *OSMemGet (OS_MEM *pmem,INT8U *perr)

    申请一个块

    INT8U OSMemNameGet (OS_MEM *pmem,INT8U **pname,INT8U *perr)

    获得内存分区的名字

    void OSMemNameSet (OS_MEM *pmem,INT8U *pname,INT8U *perr)

    设置内存分区的名字

    INT8U OSMemPut (OS_MEM *pmem,void *pblk)

    释放一个块

    INT8U OSMemQuery (OS_MEM *pmem,OS_MEM_DATA *p_mem_data)

    查询一个内存分区的信息

    void  OS_MemInit (void)

    内存分区初始化
  • 相关阅读:
    《我是一只IT小小鸟》
    实现对字符串的反转输出与句子的反转输出
    7.13学习记录
    CentOS 7 不能连接网路的解决方法
    Xshell连接linux服务器不成功的乌龙问题
    Python基础(二)数据类型
    Python基础(一)
    UML精粹3
    UML精粹2
    UML精粹1
  • 原文地址:https://www.cnblogs.com/nasduc/p/5075530.html
Copyright © 2011-2022 走看看