第七章 动态内存管理

第七章 动态内存管理

7.1 内存控制块

    μC/OS-Ⅱ对内存进行两级管理,即把一个连续的内存空间分为若干各分区,每个分区分为若干个大小相等的内存块。操作系统以分区为单位来管理动态内存,而任务以内存块为单位来获取和释放动态内存。

7.1.1 可动态分配内存划分

1. 内存块

   μC/OS-Ⅱ以内存块为单位向应用程序提供动态内存。内存块的大小由用户定制。

2. 内存分区

   大小相等的多个内存块可以组成一个内存分区。内存分区是系统对内存进行管理的基本单位。

3. 内存分区与内存块的定义

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

第七章 动态内存管理_第1张图片

7.1.2 内存控制块OS_MEM的结构

    内存控制块(OS_MEM):记录和跟踪每一个内存分区的状态。

7.1.3 空内存控制块链表

在μC/OS-Ⅱ初始化时,会调用内存控制块的初始化函数OS_MemInit()定义并初始化一个空内存控制块链表。

第七章 动态内存管理_第2张图片

7.2 动态内存的管理

7.2.1 创建动态内存分区OSMemCreate()

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

第七章 动态内存管理_第3张图片

注:分区的内存块至少有两块;每个内存块的空间至少能存放一个指针。

7.2.2 请求获得一个内存块OSMemGet()

void * OSMemGet(OS_MEM *pmem,INT8U *err);

第七章 动态内存管理_第4张图片

在调用函数OSMemGet()时,应该事先知道该分区中内存块的大小,并且在使用时不能超过该内存长度。

7.2.3 释放一个内存块OSMemPut()

INT8U OSMemPut(OS_MEM *pmem, void*pblk);

第七章 动态内存管理_第5张图片

在调用OSMemPut()函数的一个内存块时,一定要确保把该内存块释放到它原来所属的内存分区中。

7.2.4 查询一个内存分区的状态OSMemQuery()

    INT8UOSMemQuery(OS_MEM *pmem, OS_MEM_DATA *pdata);

 

你可能感兴趣的:(ucos-II读书笔记)