⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 malloc.c

📁 中芯微VC0528测试程序
💻 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 + -