[mw_shl_code=c,true]
//内存分配(内部调用)
//memx:所属内存块
//size:要分配的内存大小(字节)
//返回值:0XFFFFFFFF,代表错误;其他,内存偏移地址
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;//不需要分配
nmemb=size/memblksize[memx]; //获取需要分配的连续内存块数
if(size%memblksize[memx])nmemb++;
//------------------加入进入临界区-----------------------------
OS_CRITICAL_ENTER(); //进入临界区
//-----------------------------------------------
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;
}
//-----------------加入退出临界区-----------------------
OS_CRITICAL_EXIT(); //退出临界区
//-----------------------------------------
return (offset*memblksize[memx]);//返回偏移地址
}
}
//---------------加入退出临界区-------------------------
OS_CRITICAL_EXIT(); //退出临界区
//-----------------------------------------
return 0XFFFFFFFF;//未找到符合分配条件的内存块
}
[/mw_shl_code]
如果不加临界保护,多任务或者中断调用mymalloc()是否可能会出错?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>