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)

内存分区初始化

posted on 2015-12-25 12:09  nasduc  阅读(1050)  评论(0编辑  收藏  举报

导航