uc/os-iii学习笔记---存储管理(内存管理)

内存管理


我本人觉得内存管理反而是最容易的管理函数。
作为一个RTOS操作系统,内存管理是必备的功能,因此UCOSIII也就内存管理能力。通常应用程序可以调用ANSI C编译器的malloc()和free()函数来动态的分配和释放内存,但是在嵌入式事实操作系统中最好不要这么做,多次这样的操作会把原来很大的一块连续存储区域逐渐地分割成许多非常小并且彼此不相邻的存储区域,这就是存储碎片。
UCOSIII中提供了一种替代malloc()和free()函数的方法,UCOSIII中将存储空间分成区和块,每个存储区有数量不等大小相同的存储块,在一个系统中可以有多个存储区。


一般存储区是固定的,在程序中可以用数组来表示一个存储区,比如u8 buffer[20][10],就表示一个拥有20个存储块,每个存储块10个字节的存储区。
这里写图片描述


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; 
#if OS_CFG_DBG_EN > 0u
    OS_MEM          *DbgPrevPtr;
    OS_MEM         *DbgNextPtr;
#endif
};

函数相关:
这里写图片描述


举个例子:

//定义一个存储区
OS_MEM INTERNAL_MEM;    
//存储区中存储块数量
#define INTERNAL_MEM_NUM        5
//每个存储块大小
#define INTERNAL_MEMBLOCK_SIZE  100  
//内存池使用内部RAM
CPU_INT08U Internal_RamMemp[INTERNAL_MEM_NUM][INTERNAL_MEMBLOCK_SIZE];


OSMemCreate((OS_MEM*    )&INTERNAL_MEM,//需要在代码最前面定义,指向存储区
            (CPU_CHAR*  )"Internal Mem",//存储区名字
            (void*      )&Internal_RamMemp[0][0],//存储区基地址
            (OS_MEM_QTY )INTERNAL_MEM_NUM,//有多少个存储块可用,建议宏定义
            (OS_MEM_SIZE)INTERNAL_MEMBLOCK_SIZE,//每个存储块大小,建议宏定义
            (OS_ERR*    )&err);
//申请存储块
OSMemGet((OS_MEM*)&INTERNAL_MEM,
         (OS_ERR*)&err);
//释放存储块
OSMemPut((OS_MEM*   )&INTERNAL_MEM,
        (void*      )internal_buf,
        (OS_ERR*    )&err);
需要注意的是,申请一次后,必须对应的释放一次,而且必须连续成对,如果申请四次后再释放四次,去查看的话却只能再申请一次。也就是说,申请一次后,下一个执行的内存函数必须是释放。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值