赞
踩
在μC/OS-II中,将大块内存作为一个分区,在系统中有多个分区,每个分区又分为整数个大小相同的内存块,由于大小相同,分配和释放时间相同,应用程序根据需要从不同的分区得到不同的内存块,内存块释放时,放回以前的位置。分区和内存块的关系如下所示:
- #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; //该分区可用内存块数量
- INT32U OSNUsed; //该分区已经使用的内存块数量
- } OS_MEM_DATA;
- #endif
-
- /*$PAGE*/
- /*
v
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。