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

📄 net_globel.c

📁 在S3C2440上运行的"电子日历“(支持平年,闰年,星期自动调整). 开发环境是RVDS2.2
💻 C
字号:
/**---------------------版权 (c)----------------------------------------------------------***
***                     作者:颜章健                                                      ***
***                     邮件:jenkinyan@163.com                                           ***
***                                                                                       ***
***---------------------File Info---------------------------------------------------------***
*** 创 建 人:          颜章健                                                            ***
*** 创建日期:          2008-03-16                                                        ***
*** 创建版本:                                                                            ***
*** 文件描述:                                                                            ***
***---------------------------------------------------------------------------------------***
*** 修 订 人:                                                                            ***
*** 修订日期:                                                                            ***
*** 修订版本:                                                                            ***
*** 修订描述:                                                                            ***
***---------------------------------------------------------------------------------------**/
#include "config.h"



// 定时器相关全局变量
static	uint8	HookLength;
static	uint8	CurrentHook;
static	void	(*HookActionTab[MAX_NET_TIMER_HOOK])(void);	// 定时器动作表
static	uint32	HookTimeOutTab[MAX_NET_TIMER_HOOK];			// 定时器超时表


#ifdef	DBG_TIMER
static	char	TimerStr[100];
#endif


/********************************************************************************************
*** 函数名称:			
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
void	NetTimerInit(void)
{
	uint8	i;
	
	T0TC  = 0;								// 定时器设置为0
	T0PR  = (Fpclk / 500) - 1;				// 时钟分频:每1毫秒T0TC增加1
	T0MCR = 0x10;							// 设置T0MR0匹配后不复位T0TC,不产生中断标志
											// T0MR0匹配中断是否开启由注册服务时决定
											// T0MR1匹配后复位T0TC,但不产生中断标志
	T0MR1 = 300000;							// 每5分钟复位一次T0TC; 
	T0TCR = 0x01;							// 启动定时器
	
	HookLength = 0;
	CurrentHook = 0;
	
	for(i=0; i<MAX_NET_TIMER_HOOK; i++)
	{
		HookActionTab[i] = NULL;
		HookTimeOutTab[i] = 0;
	}
}

/********************************************************************************************
*** 函数名称:	NetTimerHookRegist		
*** 函数描述:	向定时器注册超时服务,注册期间和执行超时动作期间暂停计数器,对定时精度有影响	
*** 入    口:	ms:超时时间(单位:毫秒)	TimeOutAction:超时动作		
*** 出    口:	-1:注册失败	其他:句柄		
********************************************************************************************/
int	NetTimerHookRegist(uint32 ms, void (*TimeOutAction)(void))
{
	uint32 	value;
	uint8	i,ii,jj;
	
	#ifdef DBG_TIMER
	uint32	dbg;
	#endif
		
	if((ms == 0) || (ms >= 300000))			return -1;
	if(TimeOutAction == NULL)				return -1;
	if(HookLength == MAX_NET_TIMER_HOOK)	return -1;
	
	T0TCR = 0;								// 暂停计数
	ms += T0TC;								// 计算触发值

	#ifdef DBG_TIMER
	dbg = ms;
	if(dbg >= 300000)	dbg -= 300000;
	sprintf(TimerStr,"时间坐标=%dms\r\n",dbg);
	_printf(TimerStr);
	#endif
	
	for(i=HookLength; i>0; i--)
	{
		ii = CurrentHook + i - 1;
		if(ii  >= MAX_NET_TIMER_HOOK)
		{
			ii -= MAX_NET_TIMER_HOOK;
		}
		
		value = HookTimeOutTab[ii];
		if(value < T0TC)				
		{	
			value += T0TC;
		}
		
		if(value > ms)
		{
			jj = ii + 1;
			if(jj  >= MAX_NET_TIMER_HOOK)	
			{
				jj -= MAX_NET_TIMER_HOOK;
			}
			
			HookActionTab[jj]  = HookActionTab[ii];
			HookTimeOutTab[jj] = HookTimeOutTab[ii];
		}
		else
		{
			break;
		}	
	}

	if(ms >= 300000)
	{
		ms -= 300000;
	}
	
	i = CurrentHook + i;
	if(i  >= MAX_NET_TIMER_HOOK)	
	{
		i -= MAX_NET_TIMER_HOOK;
	}
		
	HookTimeOutTab[i] = ms;
	HookActionTab[i]  = TimeOutAction;
	HookLength++;
	
	T0MR0 = HookTimeOutTab[CurrentHook];
	if(T0MCR == 0x10) T0MCR = 0x11;			// 如果定时器中断已停止则开启定时器中断	
	
	T0TCR = 1;								// 恢复计数

	return i;
}

/********************************************************************************************
*** 函数名称:	NetTimerHookDelete		
*** 函数描述:	向定时器注册超时服务,注册期间和执行超时动作期间暂停计数器,对定时精度有影响	
*** 入    口:	Handler:句柄	
*** 出    口:	1:成功		0:失败
********************************************************************************************/
uint8	NetTimerHookDelete(int Handler)
{
	uint8	i,ii,jj,MovLen;
	
	T0TCR = 0;								// 暂停计数
	
	if((Handler < 0) || (Handler >= MAX_NET_TIMER_HOOK))	return 0;
	if(HookLength == 0)										return 0;
	if(HookActionTab[Handler] == NULL)						return 0;
	HookActionTab[Handler] = NULL;
	 
	if(Handler < CurrentHook)
	{
		ii = MAX_NET_TIMER_HOOK + Handler - CurrentHook;
	}
	else
	{
		ii = Handler - CurrentHook;
	}	
	MovLen = HookLength - ii - 1;
	
	for(i=Handler; i<MovLen; i++)
	{
		ii = i;
		if(ii  >= MAX_NET_TIMER_HOOK)
		{
			ii -= MAX_NET_TIMER_HOOK;
		}
		
		jj = ii + 1;
		if(jj  >= MAX_NET_TIMER_HOOK)
		{
			jj -= MAX_NET_TIMER_HOOK;
		}
		
		HookActionTab[ii]  = HookActionTab[jj];
		HookTimeOutTab[ii] = HookTimeOutTab[jj];
	}
	
	HookLength--;
	
	T0MR0 = HookTimeOutTab[CurrentHook];
	if(T0MCR == 0x10) T0MCR = 0x11;			// 如果定时器中断已停止则开启定时器中断	
	
	T0TCR = 1;								// 恢复计数
	
	return 1;
}

/********************************************************************************************
*** 函数名称:			
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
void	__irq	IRQ_NetTimer(void)
{
	uint8 i,j;
	
	T0TCR = 0;								// 暂停计数
	
	while(CurrentHook  >= MAX_NET_TIMER_HOOK)	
	{
		CurrentHook -= MAX_NET_TIMER_HOOK;
	}
	while(HookLength  > MAX_NET_TIMER_HOOK)	
	{
		HookLength -= MAX_NET_TIMER_HOOK;
	}

	if(HookLength)
	{
		do
		{			
			#ifdef DBG_TIMER
			sprintf(TimerStr,"时间坐标响应:%dms\r\n",HookTimeOutTab[CurrentHook]);	
			_printf(TimerStr);
			#endif
			
			j = CurrentHook;
			i = CurrentHook + 1;
			if(i  >= MAX_NET_TIMER_HOOK)	
			{
				i -= MAX_NET_TIMER_HOOK;
			}
			
			if(HookActionTab[CurrentHook] != NULL)
			{
				HookActionTab[CurrentHook]();
			}
			HookActionTab[CurrentHook]  = NULL;
			HookTimeOutTab[CurrentHook] = 0;
			
			//IRQDisable();
			HookLength--;
			CurrentHook++;
			while(CurrentHook  >= MAX_NET_TIMER_HOOK)	
			{
				CurrentHook -= MAX_NET_TIMER_HOOK;
			}			
			T0MR0 = HookTimeOutTab[CurrentHook];
			//IRQEnable();
			
			if(HookLength == 0)
			{
				T0MCR = 0x10;
				break;
			}
			
			#ifdef DBG_TIMER
			sprintf(TimerStr,"CurrentHook = %d\r\n",CurrentHook);	_printf(TimerStr);
			sprintf(TimerStr,"HookLength  = %d\r\n",HookLength);	_printf(TimerStr);
			sprintf(TimerStr,"Next=%d\r\n\r\n",HookTimeOutTab[i]);	_printf(TimerStr);
			#endif		
			
		}while(HookLength && HookTimeOutTab[i] == HookTimeOutTab[j]);
	}	
		
	T0TCR = 1;								// 恢复计数	
	T0IR = 0x01;							// 清除中断标志	
	VICVectAddr = 0x00;						// 通知VIC中断处理结束
}


/********************************************************************************************
*** 函数名称:			
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
uint32	NetTimerGetTc(void)
{
	uint32 tc;
	T0TCR = 0;
	tc	  = T0TC;
	T0TCR = 1;
	return	tc;
}


/********************************************************************************************
*** 函数名称:	IpCheckSum		
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
uint16	InetCheckSum(uint8 *Data,uint16 Length)
{
	uint16	i,len;
	uint32	sum = 0;
	uint16	*ptr = (uint16 *)Data;

	len = Length >> 1;
	
	for (i=0; i<len; i++)
	{
		sum += *ptr++;									//高16位和低16位相加
	}
	if (Length & 0x01)									//长度为单数
	{
		sum += ((*ptr)&0xff);
	}
	sum = (sum & 0xffff) + ((sum>>16)&0xffff);
	if(sum&0xffff0000)	sum++;							//有进位
		
	return ((uint16)((sum)&0xffff));
}

/********************************************************************************************
*** 函数名称:	InetMemCmp		
*** 函数描述:	内存比较		
*** 入    口:	Memory1,Memory2:被比较的两个内存指针		Length:比较长度		
*** 出    口:	无		
********************************************************************************************/
uint8	InetMemCmp(uint8 *Memory1, uint8* Memory2, uint8 Length)
{
	uint8 i;
	for(i=0; i<Length; i++)
	{
		if(*Memory1 != *Memory2)		return	0;
		Memory1++;
		Memory2++;		
	}	
	return	1;
}

/********************************************************************************************
*** 函数名称:	NetSystemInitial		
*** 函数描述:	网络协议初始化
*** 入    口:	无	
*** 出    口:	无		
********************************************************************************************/
void	NetSystemInitial(void)
{
	ModemInit("56000");	
	NetTimerInit();	
	LinkLayerInit();
	NetLayerInit();	
	UdpInit();	
	TcpInitial();	
}

/********************************************************************************************
*** 					文件结束														  ***	
********************************************************************************************/

⌨️ 快捷键说明

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