嵌入式实时操作系统μC/OS-||原理及应用学习6----动态内存管理

时间:2020-12-15 20:10:47

1.μC/OS-||对内存进行两级管理,即把一个连续的内存空间分为若干个分区,每个分区又分为若干个大小相等的内存块操作系统分区为单位来管理动态内存,而任务内存块为单位来获得和释放动态内存。内存分区及内存块的使用情况则由内存控制块来记录。

 

可动态分配内存的划分

2.内存块:以此为单位向应用程序提供动态内存。

3.内存分区:大小相等的多个内存块组成内存分区,是对系统进行内存管理的基本单位。

4.内存分区及内存块的定义:

INT16U IntMemBuf[10][10];//定义有十个内存块,每个内存块长度为0的内存分区。

5.内存控制块OS_MEM的结构(管理内存分区):记录和跟踪每个内存分区的状态。

内存控制块结构:
typedef struct{
void *OSMemAddr;//内存分区的指针
void *OSMemFreeList;//内存控制块链表指针
INT32U OSMemBlkSize;//内存块的长度--长度
INT32U OSMemNBlks;//分区内内存块的数目--总数目
INT32U OSMemNFree;//分区内当前可分配的内存块的数目--未被分配的数目
}OS_MEM;


6.内存控制块、内存分区和内存块的关系:,内存控制块的内存分区指针OSMemAddr指向了内存分区,内存分区中的各个内存块又组成了一个单向链表,内存控制块的链表指针OSMemFreeList就指向了这个单向链表的头。

嵌入式实时操作系统μC/OS-||原理及应用学习6----动态内存管理

 

动态内存的管理

7.创建动态内存分区函数:OSMemCreate()。分区的内存块至少要有两块;每个内存块的空间至少能存放一个指针,因为要建立一个用于链表连接的指针。

8.请求一个内存块:OSMemGet()。返回所请求的内存块指针。应事先知道该分区中内存块的大小,并且在使用时不能超过该内存块的长度。

9.释放一个内存块:OSMemPut()。一定要确保把内存块释放到它原来所属的内存分区中。

10.查询一个内存分区的状态:OSMemQuery()。