首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >UCOS-III笔记(十一)内存管理

UCOS-III笔记(十一)内存管理

作者头像
一个平凡而乐于分享的小比特
发布2026-02-02 16:04:54
发布2026-02-02 16:04:54
470
举报

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:UCOS-III,本专栏为UCOS-III学习记录 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

UCOS-III笔记(十一)

内存管理

​ 内存管理是指软件运行时对内存资源的分配和使用的一种技术, 其最主要的目的就是为了能够高效且快速地分配,并且在释放的时候释放不再使用的内存空间

为啥不用标准的 C 库自带的内存管理算法?

  1. 占用大量的代码空间 不适合用在资源紧缺的嵌入式系统中
  2. 没有线程安全的相关机制
  3. 运行有不确定性,每次调用这些函数时花费的时间可能都不相同
  4. 内存碎片化
内存碎片

内存碎片是由于多次申请和释放内存

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
  1. 由于每个内存块大小相同,所以分配时间一定
  2. 内存块大小相同,所以申请以及释放不会产生内存碎片

用户可以根据实际的需求,创建多个不同的内存区,每个内存区中内存块的数量和大小都可以是不同的,完全由实际的需求决定:

需用户提供内存区,并保证该内存区不被释放。

在这里插入图片描述
在这里插入图片描述

如: static uint8_t buffer[10] [32]: 表示一个具有 10 个内存块,且每个内存块大小为 32 字节的内存区

内存管理相关结构体
代码语言:javascript
复制
struct  os_mem
 {
		void                	*AddrPtr;                /* 指向内存区起始地址指针  */   
		void                	*FreeListPtr;            /* 指向空闲的内存块链表指针 */    						         OS_MEM_SIZE          	 BlkSize;                 /* 单个内存块的大小 */    
		OS_MEM_QTY           	NbrMax;                  /* 内存区中内存块的总量 */    
		OS_MEM_QTY           	NbrFree;				 /* 内存区中空闲内存块数量 */ 
	… …
};
相关API函数介绍

函数

描述

OSMemCreate()

创建一个内存区

OSMemGet()

从内存区中获取一个内存块

OSMemPut()

释放内存块到内存区中

OSMemCreate():用于创建一个内存区
代码语言:javascript
复制
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			//指向接收错误代码变量的指针  
                ) 
OSMemGet():用于从内存区中获取一个内存块
代码语言:javascript
复制
void *OSMemGet( OS_MEM* p_mem , 		//指向内存区结构体的指针
               	OS_ERR* p_err			//指向接收错误代码变量的指针
              ) //void*类型返回值  指向内存块的起始地址,如果返回NULL,代表申请失败
OSMemPut():用于释放内存块到内存区中
代码语言:javascript
复制
void OSMemPut( OS_MEM* 		p_mem , 	//指向内存区结构体的指针
				void* 		p_blk , 	//待释放的内存块
				OS_ERR* 	p_err 		//指向接收错误代码变量的指针
             ) 

注意:在一段内存没有被释放之前绝对不能再调用一次函数 OSMemGet() 为其再次分配内存,否则会导致内存泄露(OSMemGet()和OSMemPut()必须成对使用)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-26,如有侵权请联系 [email protected] 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 [email protected] 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • UCOS-III笔记(十一)
    • 内存管理
      • 内存碎片
      • 内存管理相关结构体
      • 相关API函数介绍
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档