malloc.c 内存管理(菜鸟学习)

本文介绍STM战舰V3开发板上的SDIO实验实现细节,包括内存池和内存管理状态表的定义与使用,以及内存分配和占用率计算的方法。

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

程序源码:STM战舰V3-标准例程库函数版本实验38 SD_SDIO实验
#define SRAMBANK 	2	定义支持的SRAM的块数
__align(32) u8 mem1base[MEM1_MAX_SIZE];		//内部RAM内存池	
__align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));	//外部RAM内存池			

struct _m_mallco_dev
{
	void (*init)(u8);	  //初始化内存:内存数据清空,内存状态表清空 
	u8 (*perused)(u8);		//内存使用率   定义的是perused,是指向 无返回值,形参为U8型函数的指针
	u8 	*membase[SRAMBANK];     //  内存池    
	u16 *memmap[SRAMBANK]; 				//内存管理状态表
	u8  memrdy[SRAMBANK]; 				//内存管理是否就绪
};
u8 my_mem_perused(u8 memx)  //内存占用率  
{  
    u32 used=0;  
    u32 i;  
    for(i=0;i<memtblsize[memx];i++)     //内存块的长度
    {  
        if(mallco_dev.memmap[memx][i])used++;   //查看每个内存块的状态,没有用过得 used++
    } 
    return (used*100)/(memtblsize[memx]);      //计算百分比

memmap[memx][i]的理解:

u16 *memmap[SRAMBANK];结构体定义  对于一维数组,数组名相当于指针  ,前面的定义定义了一个一维数组,数组元素为指针,memmap[memx]也是指针类型

u32 my_mem_malloc(u8 memx,u32 size)        //内存分配   *寻找到合适的连续空内存
{  
    signed long offset=0;  
    u32 nmemb;	//需要的内存块数
	u32 cmemb=0;//连续空内存块数
    u32 i;  
    if(!mallco_dev.memrdy[memx])mallco_dev.init(memx);//   未初始化,先执行初始化   
    if(size==0)return 0XFFFFFFFF;//   size=0,不需要分配内存
    nmemb=size/memblksize[memx];  	
    if(size%memblksize[memx])nmemb++;    //计算需要分配多少个内存  
    for(offset=memtblsize[memx]-1;offset>=0;offset--)//memtblsize   内存块的总个数 
    {     
		if(!mallco_dev.memmap[memx][offset])cmemb++;//检查对应内存块数的 状态表
		else cmemb=0;	
		if(cmemb==nmemb)  		//相等时即找到合适的内存区域
            for(i=0;i<nmemb;i++)  		//标注内存块分空
            {  
                mallco_dev.memmap[memx][offset+i]=nmemb;  
            }  
            return (offset*memblksize[memx]); //  返回偏移地址 
		}
    }  
    return 0XFFFFFFFF;//没有找到符合条件的内存块
}  

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值