?? malloc.c
字號:
#include "com.h"
#if 1
#define MAX_MALLC_NUM 400
#define BLOCKNUM 0X100000
UINT8 BufOSUse[BLOCKNUM];
UINT8 Mallc_Num=0;
typedef enum _MallogStatus
{
Buf_Empty=0,
Buf_FULL
}MallogStatus;
typedef struct tag_MallogCtxt
{
UINT8 *Prl;
UINT32 length;
MallogStatus Status;
}MallogCtxt,*PMallogCtxt;
MallogCtxt MallocCon[MAX_MALLC_NUM];
void InitMalloc(void)
{
UINT16 i;
for(i=0;i<MAX_MALLC_NUM;i++)
{
MallocCon[i].Prl=BufOSUse;
MallocCon[i].length=BLOCKNUM;
MallocCon[i].Status=Buf_Empty;
}
}
UINT8 CheckMalloc(void)
{
UINT16 i;
for(i=0;i<MAX_MALLC_NUM;i++)
{
if(MallocCon[i].Status==Buf_FULL)
break;
}
if(i==MAX_MALLC_NUM)
return 1;
else
return 0;
}
void RemapAddress(void)
{
UINT16 i,j;
UINT32 tempLength;
// set plr
for(i=1;i<MAX_MALLC_NUM-1;i++)
{
//000
if((MallocCon[i-1].Status==Buf_Empty)&&(MallocCon[i].Status==Buf_Empty)&&(MallocCon[i+1].Status==Buf_Empty))
{
MallocCon[i].Prl=MallocCon[i+1].Prl=MallocCon[i-1].Prl;
}
//001
else if((MallocCon[i-1].Status==Buf_Empty)&&(MallocCon[i].Status==Buf_Empty)&&(MallocCon[i+1].Status==Buf_FULL))
{
MallocCon[i].Prl=MallocCon[i-1].Prl;
}
//010
else if((MallocCon[i-1].Status==Buf_Empty)&&(MallocCon[i].Status==Buf_FULL)&&(MallocCon[i+1].Status==Buf_Empty))
{
}
//011
else if((MallocCon[i-1].Status==Buf_Empty)&&(MallocCon[i].Status==Buf_FULL)&&(MallocCon[i+1].Status==Buf_FULL))
{
}
//110
else if((MallocCon[i-1].Status==Buf_FULL)&&(MallocCon[i].Status==Buf_FULL)&&(MallocCon[i+1].Status==Buf_Empty))
{
}
//111
else if((MallocCon[i-1].Status==Buf_FULL)&&(MallocCon[i].Status==Buf_FULL)&&(MallocCon[i+1].Status==Buf_FULL))
{
}
//100
else if((MallocCon[i-1].Status==Buf_FULL)&&(MallocCon[i].Status==Buf_Empty)&&(MallocCon[i+1].Status==Buf_Empty))
{
MallocCon[i+1].Prl=MallocCon[i].Prl;
}
//101
else if((MallocCon[i-1].Status==Buf_FULL)&&(MallocCon[i].Status==Buf_Empty)&&(MallocCon[i+1].Status==Buf_FULL))
{
}
}
// check
if(CheckMalloc())
{
InitMalloc();
return;
}
// set length
j=MAX_MALLC_NUM-1;
for(i=(MAX_MALLC_NUM-1);i<MAX_MALLC_NUM;i--)
{
if(MallocCon[i].Prl<MallocCon[j].Prl)
{
if(j==(MAX_MALLC_NUM-1))
{
tempLength=BufOSUse+BLOCKNUM-MallocCon[j].Prl;
MallocCon[i].length=(MallocCon[j].Prl-MallocCon[i].Prl);
MallocCon[j].length=tempLength;
}
else
{
if(MallocCon[i].Prl==MallocCon[i-1].Prl)
continue;
tempLength=MallocCon[i].length=MallocCon[j].Prl-MallocCon[i].Prl;
}
if(j-i>1)
{
for(j=j;j>(i+1);j--)
{
MallocCon[j-1].length=tempLength;
}
}
j=i;
}
}
}
void* MemMalloc(UINT32 size)
{
UINT16 i;
UINT8 *tempPoint;
//find empty
for(i=0;i<MAX_MALLC_NUM;i++)
{
if((MallocCon[i].Status==Buf_Empty)&&(MallocCon[i].length>=size))
{
MallocCon[i].Status=Buf_FULL;
if(MallocCon[i+1].Status==Buf_Empty)
{
//MallocCon[i].length=size;
//MallocCon[i+1].length+=(MallocCon[i].length-size);
MallocCon[i+1].Prl=MallocCon[i].Prl+(size+3)/4*4;
}
tempPoint=MallocCon[i].Prl;
break;
}
}
if(i==MAX_MALLC_NUM)
{
Uart_Printf("\n buf full");
return 0;
}
RemapAddress();
//tmPrintf("\n s3a_malloc =0x%x,length=0x%x",tempPoint,size);
return tempPoint;
}
void MemFree(void *Prl)
{
UINT16 i;
for(i=0;i<MAX_MALLC_NUM;i++)
{
if((Prl==MallocCon[i].Prl))
{
if(MallocCon[i].Status==Buf_FULL)
{
MallocCon[i].Status=Buf_Empty;
}
else
{
Uart_Printf("\n free error");
}
break;
}
}
if(i==MAX_MALLC_NUM)
{
Uart_Printf("\n free error");
return;
}
RemapAddress();
//tmPrintf("\n OSFree=0x%x",Prl);
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -