目录
前言
1. 内存管理概述
2. 内存区域(存储区)和内存块
3. 存储区控制块(OS_MEM)
4. 内存管理函数
5. 内存碎片问题
6. 注意事项
7.代码实现
7.1创建内存区域
7.2申请内存
7.3释放内存
前言
UCOSIII(即Micrium μC/OS-III)的内存管理是其操作系统功能的一个重要组成部分,旨在高效地管理和分配系统内存资源。以下是对UCOSIII内存管理的详细介绍:
1. 内存管理概述
UCOSIII将内存管理分为不同的区域(或称为“区”)和块。每个区域包含多个固定大小的内存块,这些内存块用于满足应用程序的不同内存需求。
2. 内存区域(存储区)和内存块
- 内存区域(存储区):是一个连续的内存空间,被划分为多个固定大小的内存块。这些区域在程序中是固定的,通常通过数组来表示,例如
u8 buffer[20][10]
表示一个有20个存储块,每个存储块10字节的存储区。 - 内存块:是内存区域中的基本单位,具有固定的大小。应用程序可以根据需要申请和释放这些内存块。
3. 存储区控制块(OS_MEM)
UCOSIII使用OS_MEM
结构体来表示内存区域(存储区)的控制块。这个结构体包含了关于内存区域的重要信息,如内存区域的起始地址、名称、空闲块指针、块大小、最大块数和空闲块数等。
struct OS_MEM {
OS_OBJ_TYPE Type; // 类型
void *AddrPtr; // 指向存储区起始地址
CPU_CHAR *NamePtr; // 指向存储区名字
void *FreeListPtr; // 指向空闲存储块
OS_MEM_SIZE BlkSize; // 存储块大小,单位:字节
OS_MEM_QTY NbrMax; // 存储区中总的存储块数
OS_MEM_QTY NbrFree; // 存储区中空闲存储块数
// 可能还有其他用于调试的成员
};
4. 内存管理函数
UCOSIII提供了几个关键的内存管理函数,用于创建内存区域、申请和释放内存块:
- OSMemCreate():创建一个新的内存区域。这个函数需要指定内存区域的名称、基地址、块数量和块大小等参数。
- OSMemGet():从指定的内存区域中申请一个内存块。如果成功,该函数将返回一个指向内存块的指针;如果失败(例如,没有可用的内存块),则返回NULL。
- OSMemPut():将之前申请的内存块释放回其所属的内存区域。这个函数需要指定内存区域和要释放的内存块指针。
5. 内存碎片问题
在嵌入式系统中,频繁地分配和释放小块内存可能会导致内存碎片问题。UCOSIII通过提供固定大小的内存块来避免这种情况,因为每个内存块在释放时都会返回到其原始的内存区域中,从而减少了内存碎片的产生。
6. 注意事项
- 在使用UCOSIII的内存管理功能时,应确保遵守其API函数的调用规则和限制。
- 根据应用程序的内存需求,合理规划和分配内存区域和内存块。
- 注意内存碎片问题,并尽可能避免在嵌入式系统中使用
malloc()
和free()
等函数,因为它们可能会导致内存碎片的产生。
7.代码实现
7.1创建内存区域
//定义一个存储区
OS_MEM EXTERNAL_MEM;
//存储区中存储块数量
#define EXTRENNAL_MEM_NUM 5
//每个存储块大小
//由于一个指针变量占用4字节所以块的大小一定要为4的倍数
//而且必须大于一个指针变量(4字节)占用的空间,否则的话存储块创建不成功
#define EXTERNAL_MEMBLOCK_SIZE 100
//存储区的内存池,使用外部SRAM
__align(32) volatile CPU_INT08U External_RamMemp[EXTRENNAL_MEM_NUM][EXTERNAL_MEMBLOCK_SIZE] __attribute__((at(0XC0800000)));
//创建一个存储分区
OSMemCreate((OS_MEM* )&EXTERNAL_MEM,
(CPU_CHAR* )"External Mem",
(void* )&External_RamMemp[0][0],
(OS_MEM_QTY )EXTRENNAL_MEM_NUM,
(OS_MEM_SIZE)EXTERNAL_MEMBLOCK_SIZE,
(OS_ERR* )&err);
7.2申请内存
typedef unsigned char CPU_INT08U; /* 8-bit unsigned integer */
static u8 external_memget_num;
CPU_INT08U *external_buf;
//申请内存
external_buf=OSMemGet((OS_MEM*)&EXTERNAL_MEM,(OS_ERR*)&err);
7.3释放内存
OSMemPut((OS_MEM* )&EXTERNAL_MEM, //释放内存
(void* )external_buf,
(OS_ERR* )&err);