指针数组作为结构体成员,实现类似二维数组调用的一种方法

//在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[]长度不尽相同。

猜你喜欢

转载自blog.csdn.net/wangjianlin1996/article/details/93712718