在μC/OS-II中,将大块内存作为一个分区,在系统中有多个分区,每个分区又分为整数个大小相同的内存块,由于大小相同,分配和释放时间相同,应用程序根据需要从不同的分区得到不同的内存块,内存块释放时,放回以前的位置。分区和内存块的关系如下所示:
1、内存管理全局变量及相关数据结构
- 宏定义
#define OS_MEM_EN 0 //是否开启内存管理
#define OS_MEM_NAME_SIZE 16 //内存分区名大小
#define OS_MEM_QUERY_EN 1 //是否允许内存分区信息查询
#define OS_MAX_MEM_PART 5 //最多内存分区数
- 全局变量
#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
OS_EXT OS_MEM *OSMemFreeList; //指向下一个可用内存分区
OS_EXT OS_MEM OSMemTbl[OS_MAX_MEM_PART];//内存分区控制块数组
#endif
- 数据结构
为了跟踪每个内存分区,引入内存控制块OS_MEM进行管理。OSMemAddr为指向该内存分区起始地址的指针,当调用OSMemCreate时初始化,之后不能修改。OSMemFreeList为指向下一个可用内存控制块或下一个空余内存块的指针。OSMemBlkSize在建立该内存分区时建立,表示内存分区中单个内存块的大小。OSMemNBlks表示内存分区中总的内存块数量。OSMemNFree为内存分区中当前空余内存块数量。
为了方便查询内存块信息,引入OS_MEM_DATA结构, 和内存控制块类似,OSAddr表示指向内存分区开始地址,OSFreeList表示指向该分区下一个可用内存块,OSBlkSize表示该分区每个内存块大小,OSNBlks表示该分区总内存块数量,OSNFree表示该分区可用内存块数量,OSNUsed该分区已经使用的内存块数量。
/*
*********************************************************************************************************
* MEMORY PARTITION DATA STRUCTURES
*********************************************************************************************************
*/
#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
typedef struct os_mem { //内存控制块
void *OSMemAddr; //指向内存分区开始地址
void *OSMemFreeList; //指向该分区下一个可用内存分区
INT32U OSMemBlkSize; //该分区单个内存块大小
INT32U OSMemNBlks; //该分区内存块数量
INT32U OSMemNFree; //该分区剩余可用内存块
#if OS_MEM_NAME_SIZE > 1
INT8U OSMemName[OS_MEM_NAME_SIZE]; //分区名
#endif
} OS_MEM;
typedef struct os_mem_data { //内存分区信息结构体
void *OSAddr; //指向内存分区开始地址
void *OSFreeList; //指向该分区下一个可用内存块
INT32U OSBlkSize; //该分区每个内存块大小
INT32U OSNBlks; //该分区总内存块数量
INT32U OSNFree;