我觉得代码中阴影部分中应该是
int index=offset/memblksize[memx]+1;
举个例子
在外部flash中 __align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));
外部flash的首地址为0x68000000,每个块的大小为32字节,块1的地址范围为:0x68000000-0x68000020-1,
块2的
地址范围为:0x68000020-0x68000040-1,
块3的地址范围为:0x68000040-0x68000060-1,
块4的地址范围为:0x68000060-0x68000080-1,
..........................................................................
任取一个地址0x68000050,偏移量为0x50=80, 这个地址应该落在块3中,根据程序中的运算 int index=offset/memblksize[memx]=80/32=2,按照计算的结果该地址落在块2中。在这种情况下int nmemb=mallco_dev.memmap[memx][index]; //内存块数量,获得的内存块的数量并不是要释放的内存块的数量,而是紧邻释放内存块的低地址内存块的数量。按照例程执行下来,是释放内存块的前面一个内存块开始,
紧邻释放内存块的低地址内存块的数量。这样,不需要释放的内存块释放了一个;假设需要释放的内存块的个数为n,相邻低地址的内存块为m,如果n+1=m,需要释放的内存块被全部释放,如果n+1<m,需要释放的内存块紧邻高低址内存也被释放一部分;如果n+1>m,需要释放的内存块部分被释放。
我觉得应该是
int index=offset/memblksize[memx]+1;
纯属个人意见,对与不对,还各位大神多多指正!
先看内存管理的图片
这个图没有问题,内存块从1和从0开始,不重要,确定内存块是否被占用,并不是直接访问内存块,而是通过内存状态表数组的状态标识。内存状态表的元素个数和内存块是一一对应的,数组状态表的第0个元素对应第一个内存块,这个是由内存分配的过程决定的
内存分配
for(offset=memtblsize[memx]-1;offset>=0;offset--)//搜索整个内存区
{
if(!mallco_dev.memmap[memx][offset]) //说明状态表元素和内存块的对应关系
cmemb++; //连续内存块数增加
else cmemb=0; // 内存块数清0,我觉得这句没有作用,如果有满足条件的内存块,不会执行该句就已退出;如果没有满足条件的,执行该句退出,由于cmemb是局部变量,生存周期只在该函数中,第二次调用该函数时cmemb的初值就是0
if(cmemb==nmemb) //找到了nmemb个连续内存块
{
for(i=0;i<nmemb;i++) // 标注内存块被占用
{
mallco_dev.memmap[memx][offset+i]=nmemb;
}
return (offset*memblksize[memx]); //·返回内存块偏移地址·
}
}
再返回去看内存释放中的函数
int index=offset/memblksize[memx]; //偏移所在内存块的号码
int nmemb=mallco_dev.memmap[memx][index]; // 内存块数量
for(i=0;i<nmemb;i++) //内存状态表清0
{
mallco_dev.memmap[memx][index+i]=0;
}
return 0;
int index=offset/memblksize[memx]; //偏移所在内存块的号码 index并不是所在内存块的号码,而是与内存块对应的内存状态表的下标,应该说index是偏移所在内存块的索引。
一周热门 更多>