//在malloc.h中:(已知SRAMBANK=3)
struct _m_mallco_dev
{
void (*init)(u8); //初始化
u8 (*perused)(u8); //内存使用率
u8 *membase[SRAMBANK]; //内存池 管理SRAMBANK个区域的内存
u16 *memmap[SRAMBANK]; //内存管理状态表
u8 memrdy[SRAMBANK]; //内存管理是否就绪
};
extern struct _m_mallco_dev mallco_dev; //在mallco.c里面定义
//在malloc.c中:
u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP
u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE))); //外部SRAM内存池MAP
u16 mem3mapbase[MEM3_ALLOC_TABLE_SIZE] __attribute__((at(0X10000000+MEM3_MAX_SIZE))); //内部CCM内存池MAP
struct _m_mallco_dev mallco_dev=
{
my_mem_init, //内存初始化
my_mem_perused, //内存使用率
mem1base,mem2base,mem3base, //内存池
mem1mapbase,mem2mapbase,mem3mapbase,//内存管理状态表的起始地址,16位指针
0,0,0, //内存管理未就绪
};
//也就是结构体定义时,可以把指针数组的每个元素都写出来,分别定义,只要保持地址对准即可。
//memmap[]的每个元素的值,都是某个一定长度16位数组的起始地址,通过全局变量方式定义。“数组的元素是其他数组的指针”
//则可以这么使用:
for(offset=memtblsize[memx]-1;offset>=0;offset--)//搜索整个内存控制区
{
if(!mallco_dev.memmap[memx][offset])cmemb++;//连续空内存块数增加
else cmemb=0; //连续内存块清零
if(cmemb==nmemb) //找到了连续nmemb个空内存块
{
for(i=0;i<nmemb;i++) //标注内存块非空
{
mallco_dev.memmap[memx][offset+i]=nmemb;
}
return (offset*memblksize[memx]);//返回偏移地址
}
}
//引用时,通过 mallco_dev.memmap[memx]中memx的不同,来确定使用的是memmap[]的哪一个元素,后续的offset就是实际调用的数组memmapbase[]的偏移量了
//所以有mallco_dev.memmap[memx][offset],这种写法与二维数组形式相同,原理也相似。之所以不写成二维数组,是因为每个memmapbase[]长度不尽相同。