📄 net_globel.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 + -