程序源码: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;//没有找到符合条件的内存块
}
}