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) |
内存分区初始化 |