μC/OS-II--内存管理

本文详细介绍了μC/OS-II操作系统中的内存管理,包括内存管理的全局变量、内存分区初始化、创建内存分区、分配和释放内存块以及查询内存分区状态等步骤。通过对内存控制块和内存数据结构的解析,阐述了如何有效地管理和利用内存资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在μ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;            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值