🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:UCOS-III,本专栏为UCOS-III学习记录 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖
内存管理是指软件运行时对内存资源的分配和使用的一种技术, 其最主要的目的就是为了能够高效且快速地分配,并且在释放的时候释放不再使用的内存空间
为啥不用标准的 C 库自带的内存管理算法?
内存碎片是由于多次申请和释放内存

UCOSIII提供了一个内存管理的方案,将一块大内存作为一个内存区,一个内存区中有多个大小均相同的内存块组成

用户可以根据实际的需求,创建多个不同的内存区,每个内存区中内存块的数量和大小都可以是不同的,完全由实际的需求决定:
需用户提供内存区,并保证该内存区不被释放。

如: static uint8_t buffer[10] [32]: 表示一个具有 10 个内存块,且每个内存块大小为 32 字节的内存区
struct os_mem
{
void *AddrPtr; /* 指向内存区起始地址指针 */
void *FreeListPtr; /* 指向空闲的内存块链表指针 */ OS_MEM_SIZE BlkSize; /* 单个内存块的大小 */
OS_MEM_QTY NbrMax; /* 内存区中内存块的总量 */
OS_MEM_QTY NbrFree; /* 内存区中空闲内存块数量 */
… …
};函数 | 描述 |
|---|---|
OSMemCreate() | 创建一个内存区 |
OSMemGet() | 从内存区中获取一个内存块 |
OSMemPut() | 释放内存块到内存区中 |
void OSMemCreate( OS_MEM* p_mem, //指向内存区结构体的指针
CPU_CHAR* p_name, //指向作为内存区名的 ASCII 字符串的指针
void* p_addr, //指向内存区起始地址的指针
OS_MEM_QTY n_blks, //内存区中内存块的数量
OS_MEM_SIZE blk_size, //内存区中内存块的大小
OS_ERR* p_err //指向接收错误代码变量的指针
) void *OSMemGet( OS_MEM* p_mem , //指向内存区结构体的指针
OS_ERR* p_err //指向接收错误代码变量的指针
) //void*类型返回值 指向内存块的起始地址,如果返回NULL,代表申请失败void OSMemPut( OS_MEM* p_mem , //指向内存区结构体的指针
void* p_blk , //待释放的内存块
OS_ERR* p_err //指向接收错误代码变量的指针
) 注意:在一段内存没有被释放之前绝对不能再调用一次函数 OSMemGet() 为其再次分配内存,否则会导致内存泄露(OSMemGet()和OSMemPut()必须成对使用)