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

📄 ggt_func.c

📁 ARM下的多任务操作系统源码:GogotoOS
💻 C
字号:
/****************************************************************************************************
**                                        Gogoto OS
**                           (c) Copyright 2007-2008, luyigui(卢益贵)
**                                     All Rights Reserved
**                                         V1.00.0
**
**	                           狗狗兔嵌入式多任务系统(基于消息机制)    
**    					 绿城代码、GGT-OS、Gogoto OS、狗狗兔嵌入式、狗狗兔系统
**						    		 	QQ:48092788
**
**------------------文件信息------------------------------------------------------------------------
**  文件名: GGT_Func.c
**  创建人: 卢益贵
**  日 期: 2007年12月8日
**  版  本: V1.00.0
**  描  述: Gogoto OS 功能 函数单元
**

**------------------修改记录------------------------------------------------------------------------
**  修改人:	卢益贵
**  版  本:	1.80.0
**  日 期:	2008年1月8日
**  描 述: 增加常用的功能函数
**

****************************************************************************************************/

#include		"GGT_OS.h"
#include		"GGT_SysType.h"

/****************************************************************************************************
**  函数名: ListFirst
**  描  述: 链表头
**  输 入: pFirst:链表头变量地址
			pNode:节点地址
**  输 出: 无
**  创建人: 卢益贵
**  日 期: 2007年12月8日

**------------------修改记录------------------------------------------------------------------------
**  修改人: 
**  日 期:
**  说  明:
**  原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void ListFirst(void *pFirst, void *pNode)
{
	*(void **)pNode = *(void **)pFirst;
	*(void **)pFirst = pNode;
}

/****************************************************************************************************
**  函数名: ListAppend
**  描  述: 链表挂尾
**  输 入: pFirst:链表头变量地址
			pNode:节点地址
**  输 出: 无
**  创建人: 卢益贵
**  日 期: 2007年12月8日

**------------------修改记录------------------------------------------------------------------------
**  修改人: 
**  日 期:
**  说  明:
**  原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void ListAppend(void *pFirst, void *pNode)
{
	*(void **)pNode = 0;
	while(*(void **)pFirst)
		pFirst = (void **)(*(void **)pFirst);
	*(void **)pFirst = pNode;
}

/****************************************************************************************************
**  函数名: ListDelete
**  描  述: 链表节点删除
**  输 入: pFirst:链表头变量地址
			pNode:节点地址
**  输 出: 无
**  创建人: 卢益贵
**  日 期: 2007年12月8日

**------------------修改记录------------------------------------------------------------------------
**  修改人: 
**  日 期:
**  说  明:
**  原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void ListDelete(void *pFirst, void *pNode)
{
	while(*(void **)pFirst)
	{
		if(*(void **)pFirst == pNode)
		{
			*(void **)pFirst = *(void **)pNode;
			return;
		}
		pFirst = (void **)(*(void **)pFirst);
	}
}

/****************************************************************************************************
**  函数名: ListInsert
**  描  述: 链表节点插入
**  输 入: pFirst:链表头变量地址
			pNode:节点地址
			pIsHere:判断插入点函数
**  输 出: 无
**  创建人: 卢益贵
**  日 期: 2007年12月8日

**------------------修改记录------------------------------------------------------------------------
**  修改人: 
**  日 期:
**  说  明:
**  原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void ListInsert(void *pFirst, void *pNode,
				BOOL (*pIsHere)(void *pNode, void *pNodeIns))
{
	while(*(void **)pFirst)
	{
		if(NULL == (*pIsHere)(*(void **)pFirst, pNode))
		{
			*(void **)pNode = *(void **)pFirst;
			*(void **)pFirst = pNode;
			return;
		}
		pFirst = (void **)(*(void **)pFirst);
	}
	*(void **)pNode = 0;
	*(void **)pFirst = pNode;
}

/****************************************************************************************************
**  函数名: BoxInit
**  描  述: 内存合初始化
**  输 入: pBoxHead:盒子头
			BoxSize:盒子空间大小
			BoxSize:块空间大小
**  输 出: 无
**  创建人: 卢益贵
**  日 期: 2007年12月8日

**------------------修改记录------------------------------------------------------------------------
**  修改人: 
**  日 期:
**  说  明:
**  原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void BoxInit(void *pBoxHead, INT32 BoxSize, INT32 BlockSize) 
{
	void *pEnd, *pBlock, *pNext;

	if((sizeof(UINT32) > BlockSize) || ((BlockSize + sizeof(_BoxHead) > BoxSize)))
		return;

	pBlock = ((UINT8 *)pBoxHead) + sizeof(_BoxHead);
	((_pBoxHead)pBoxHead)->pFree = pBlock;
	pEnd = ((UINT8 *)pBoxHead) + BoxSize;

	pEnd = ((UINT8 *)pEnd) - BlockSize;
	while(1)  
	{
		pNext = ((UINT8 *)pBlock) + BlockSize;
		if(pNext > pEnd)  
			break;
		*((void **)pBlock) = pNext;
		pBlock = pNext;
	}

	*((void **)pBlock) = 0;
}

/****************************************************************************************************
**  函数名: BoxAlloc
**  描  述: 内存块分配
**  输 入: pBoxHead:盒子头
**  输 出: 无
**  创建人: 卢益贵
**  日 期: 2007年12月8日

**------------------修改记录------------------------------------------------------------------------
**  修改人: 
**  日 期:
**  说  明:
**  原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void *BoxAlloc(void *pBoxHead)
{
	void **pFree;

	pFree = ((_pBoxHead)pBoxHead)->pFree;
	if(pFree) 
		((_pBoxHead)pBoxHead)->pFree = *pFree;

	return(pFree);
}

/****************************************************************************************************
**  函数名: BoxFree
**  描  述: 内存块释放
**  输 入: pBoxHead:盒子头
			pBox:块地址
**  输 出: 无
**  创建人: 卢益贵
**  日 期: 2007年12月8日

**------------------修改记录------------------------------------------------------------------------
**  修改人: 
**  日 期:
**  说  明:
**  原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void BoxFree(void *pBoxHead, void *pBox)
{
	*((void **)pBox) = ((_pBoxHead)pBoxHead)->pFree;
	((_pBoxHead)pBoxHead)->pFree = pBox;
}

void ClearBuf(UINT8 *pBuf, INT32 Len)
{
	while(Len--)
		*pBuf++ = 0;
}

void FullBuf(UINT8 *pBuf, INT32 Len, UINT8 Data)
{
	while(Len--)
		*pBuf++ = Data;
}

UINT32 StrToDWord(UINT8 *pStr)
{
	UINT32 R;

	R = 0;
	while(*pStr)
	{
		R = R * 10 + (*pStr - '0');
		pStr++;
	}
	return(R);
}

INT32 StrToInt(UINT8 *pStr)
{
	if('-' == *pStr)
		return(-((int)StrToDWord(pStr + 1)));
	else
		return((int)StrToDWord(pStr));
}

UINT32 HexCharToDWord(UINT8 Char)
{
	if(('0' <= Char) && ('9' >= Char))
		return(Char - '0');
	else
	if(('A' <= Char) && ('F' >= Char))
		return(10 + (Char - 'A'));
	else
	if(('a' <= Char) && ('f' >= Char))
		return(10 + (Char - 'a'));
	else
		return(0);
}

UINT32 HexToDWord(UINT8 *pStr)
{
	UINT32 R;

	R = 0;
	while(*pStr)
	{
		R = R * 16 + HexCharToDWord(*pStr);
		pStr++;
	}
	return(R);
}

float StrToFloat(UINT8 *pStr)
{
	float R, RR;
	UINT8 IsFloat;
	
	R = 0;
	IsFloat = 0;
	
	if('-' == *pStr)
	{
		RR = -1;
		pStr++;
	}else
		RR = 1;

	while(*pStr)
	{
		if('.' == *pStr)
		{
			IsFloat = 1;	
		}else
		{
			R = R * 10 + (*pStr - '0');
			if(IsFloat)
				RR *= 10;
		}

		pStr++;
	}

	return(R / RR);
}

void MemoCopy(UINT8 *pD, UINT8 *pS, INT32 iLen)
{
	while(iLen)
	{
		*pD = *pS;
		pD++;
		pS++;
		iLen--;
	}
}

INT32 StrCopy(UINT8 *pD, UINT8 *pS)
{
	INT32 Len = 0;

	while(*pS)
	{
		*pD = *pS;
		pD++;
		pS++;
		Len++;
	}
	*pD = 0;
	return Len;
}

INT32 StrAdd(UINT8 *pD, UINT8 *pS)
{
	INT32 Len = 0;

	while(*pD) 
		pD++;

	while(*pS)
	{
		*pD = *pS;
		pD++;
		pS++;
		Len++;
	}
	*pD = 0;
	return Len;
}

void IntToStr(INT32 Data, UINT8 *pStr)
{
	INT32 Tmp1, Tmp2, IsTrue;

	Tmp1 = 1000000000;	
	if(0 > Data)
	{
		*pStr++ = '-';
		Data = -Data;
	}
	if(0 == Data)
	{
		*pStr++ = '0';
	}else
	{
		IsTrue = 0;
		while(Tmp1)
		{
			Tmp2 = (int)(Data / Tmp1);
			Data %=  Tmp1;
			if(IsTrue || Tmp2)
			{
				*pStr++ = (UINT8)('0' + Tmp2);
				IsTrue = 1;
			}		
			Tmp1 = (int)(Tmp1 / 10);
		}
	}

	*pStr = 0;
}

void DWordToStr(UINT32 Data, UINT8 *pStr)
{
	UINT32 Tmp1, Tmp2, IsTrue;

	Tmp1 = 1000000000;	
	
	if(0 == Data)
	{
		*pStr++ = '0';
	}else
	{
		IsTrue = 0;
		while(Tmp1)
		{
			Tmp2 = (UINT32)(Data / Tmp1);
			Data %=  Tmp1;
			if(IsTrue || Tmp2)
			{
				*pStr++ = (UINT8)('0' + Tmp2);
				IsTrue = 1;
			}		
			Tmp1 = (UINT32)(Tmp1 / 10);
		}
	}

	*pStr = 0;
}

void FloatToStr(float fData, UINT8 *pStr)
{
	INT32 Tmp1, Tmp2, IsTrue, iData;

	Tmp1 = 1000000000;	
	iData = (int)fData;
	fData = fData - iData;
	if(0 > iData)
	{
		*pStr++ = '-';
		iData = -iData;
		fData = -fData;
	}

	if(0 == iData)
	{
		*pStr++ = '0';
	}else
	{
		IsTrue = 0;
		while(Tmp1)
		{
			Tmp2 = (int)(iData / Tmp1);
			iData %=  Tmp1;
			if(IsTrue || Tmp2)
			{
				*pStr++ = (UINT8)('0' + Tmp2);
				IsTrue = 1;
			}		
			Tmp1 = (int)(Tmp1 / 10);
		}
	}

	*pStr++ = '.';
	if(0 == fData)
	{
		*pStr++ = '0';
	}else
	{
		while(fData > 0)
		{
			fData = fData * 10;
			Tmp1 = (int)fData;
			*pStr++ = (UINT8)('0' + Tmp1);
			fData = fData - Tmp1;
		}
	}

	*pStr = 0;
}

INT32 StrLen(UINT8 *pStr)
{
	INT32 iLen;

	iLen = 0;

	while(*pStr)
	{
		pStr++;
		iLen++;
	}

	return(iLen);
}

INT32 StrNCmp(UINT8 *pStr, UINT8 *pBuf)
{
	INT32 R;

	R = 0;

	while(*pStr)
	{
		R = ((int)(*pStr)) - ((int)(*pBuf));
		if(0 != R)
			return R;
		*pStr++;
		*pBuf++;
	}

	return R;
}

UINT8* FindChar(UINT8 *pBuf, INT32 Len, UINT8 Char)
{
	while(Len--)
	{
		if(*pBuf == Char)
		{
			return pBuf;
		}
		*pBuf++;
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -