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就指向了这个单向链表的头。
动态内存的管理
7.创建动态内存分区函数:OSMemCreate()。分区的内存块至少要有两块;每个内存块的空间至少能存放一个指针,因为要建立一个用于链表连接的指针。
8.请求一个内存块:OSMemGet()。返回所请求的内存块指针。应事先知道该分区中内存块的大小,并且在使用时不能超过该内存块的长度。
9.释放一个内存块:OSMemPut()。一定要确保把内存块释放到它原来所属的内存分区中。
10.查询一个内存分区的状态:OSMemQuery()。