作为一个操作系统,内存管理是必不可少的一部分。在UCOSIII中也有内存管理模块,使用内存管理模块可以动态的分配和释放内存,这样可以高效的使用“昂贵”的内存资源。
1 存管理简介
内存管理是一个操作系统必备的系统模块,我们在用VC++或者Visual Studio学习C语言的时候会使用malloc()和free()这两个函数来申请和释放内存。我们在使用Keil MDK编写STM32程序的时候可以使用malloc()和free(),但是这样的操作会将原来大块内存逐渐分割成很多个小块内存,参数大量的内存碎片,最终导致应用不能申请到大小合适和连续的内存。
UCOSIII提供了独特的动态内存方案,UCOSIII将存储空间分为区和块,一个存储区有多个固定大小的库组成。

一般存储区是固定的,在程序中可以用数组来表示一个存储区,比如u8 buffer[20][10]就表示一个有20个存储块,每个存储块10字节的存储区。如果我们定义的存储区在程序运行期间都不会被删除掉,一直有效,那么存储区内存也可以使用malloc()来分配。在创建存储区以后应用程序就可以获得固定大小的存储块。
在实际使用中我们可以根据应用程序对内存需求的不同建立多个存储区,每个存储区中有不同大小、不对数量的存储块,应用程序可以根据所需内存不同从不同的存储区中申请内存使用,使用完以后在释放到相应的存储区中。
2 存储区创建
在使用内存管理之前首先要创建存储区,在创建存储区之前我们先了解一个重要的结构体,存储区控制块:OS_MEM,结构体OS_MEM如下,取消了与调试有关的变量:
struct OS_mem
{
OS_OBJ_TYPE Type; //类型,必须为OS_OBJ_TYPE_MEM
void *AddrPtr; //指向存储区起始地址
CPU_CHAR *NamePtr; //指向存储区名字
void *FreeListPtr; //指向空闲存储块
OS_MEM_SIZE BlkSize; //储存区中存储块大小,单位:字节
OS_MEM_QTY NbrMax; //存储区中总的储存块数
OS_MEM_QTY NbrFree; //存储区中空闲存储块数
}
创建存储区使用函数OSMemCreate(),函数原型:
void OSMemCreate(OS_MEM *p_mem, //指向存储区控制块地址,一般为一个OS_MEM结构体
CPU_CHAR *p_name, //指向存储区的名字
void *p_addr, //存储区所有存储空间基地址
OS_MEM_QTY n_blks, //存储区中存储块个数
OS_MEM_SIZE blk_size,//存储块大小
OS_ERR *p_err) //返回的错误码

调用函数OSMemCreate()创建好的存储区如下图:

3 存储块的使用
3.1 内存申请
使用函数OSMemGet()来获取存储块,函数原型如下:
void *OSMemGet(OS_MEM *p_mem, //要使用的存储区
OS_ERR *p_err)
函数OSMemGet()原型的具体操作流程:

3.2 内存释放
在UCOSIII中内存的释放可以使用函数OSMemPut()函数来完成:
void *OSMemPut(OS_MEM *p_mem, //指向存储区控制块,也就是要接受存储块的那个存储区
void *p_blk, //指向存储块,要归还的存储块
OS_ERR *p_err)
函数原型的具体操作流程:


1394

被折叠的 条评论
为什么被折叠?



