?? net_globel.c
字號(hào):
/**---------------------版權(quán) (c)----------------------------------------------------------***
*** 作者:顏章健 ***
*** 郵件:jenkinyan@163.com ***
*** ***
***---------------------File Info---------------------------------------------------------***
*** 創(chuàng) 建 人: 顏章健 ***
*** 創(chuàng)建日期: 2008-03-16 ***
*** 創(chuàng)建版本: ***
*** 文件描述: ***
***---------------------------------------------------------------------------------------***
*** 修 訂 人: ***
*** 修訂日期: ***
*** 修訂版本: ***
*** 修訂描述: ***
***---------------------------------------------------------------------------------------**/
#include "config.h"
// 定時(shí)器相關(guān)全局變量
static uint8 HookLength;
static uint8 CurrentHook;
static void (*HookActionTab[MAX_NET_TIMER_HOOK])(void); // 定時(shí)器動(dòng)作表
static uint32 HookTimeOutTab[MAX_NET_TIMER_HOOK]; // 定時(shí)器超時(shí)表
#ifdef DBG_TIMER
static char TimerStr[100];
#endif
/********************************************************************************************
*** 函數(shù)名稱(chēng):
*** 函數(shù)描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void NetTimerInit(void)
{
uint8 i;
T0TC = 0; // 定時(shí)器設(shè)置為0
T0PR = (Fpclk / 500) - 1; // 時(shí)鐘分頻:每1毫秒T0TC增加1
T0MCR = 0x10; // 設(shè)置T0MR0匹配后不復(fù)位T0TC,不產(chǎn)生中斷標(biāo)志
// T0MR0匹配中斷是否開(kāi)啟由注冊(cè)服務(wù)時(shí)決定
// T0MR1匹配后復(fù)位T0TC,但不產(chǎn)生中斷標(biāo)志
T0MR1 = 300000; // 每5分鐘復(fù)位一次T0TC;
T0TCR = 0x01; // 啟動(dòng)定時(shí)器
HookLength = 0;
CurrentHook = 0;
for(i=0; i<MAX_NET_TIMER_HOOK; i++)
{
HookActionTab[i] = NULL;
HookTimeOutTab[i] = 0;
}
}
/********************************************************************************************
*** 函數(shù)名稱(chēng): NetTimerHookRegist
*** 函數(shù)描述: 向定時(shí)器注冊(cè)超時(shí)服務(wù),注冊(cè)期間和執(zhí)行超時(shí)動(dòng)作期間暫停計(jì)數(shù)器,對(duì)定時(shí)精度有影響
*** 入 口: ms:超時(shí)時(shí)間(單位:毫秒) TimeOutAction:超時(shí)動(dòng)作
*** 出 口: -1:注冊(cè)失敗 其他:句柄
********************************************************************************************/
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; // 暫停計(jì)數(shù)
ms += T0TC; // 計(jì)算觸發(fā)值
#ifdef DBG_TIMER
dbg = ms;
if(dbg >= 300000) dbg -= 300000;
sprintf(TimerStr,"時(shí)間坐標(biāo)=%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; // 如果定時(shí)器中斷已停止則開(kāi)啟定時(shí)器中斷
T0TCR = 1; // 恢復(fù)計(jì)數(shù)
return i;
}
/********************************************************************************************
*** 函數(shù)名稱(chēng): NetTimerHookDelete
*** 函數(shù)描述: 向定時(shí)器注冊(cè)超時(shí)服務(wù),注冊(cè)期間和執(zhí)行超時(shí)動(dòng)作期間暫停計(jì)數(shù)器,對(duì)定時(shí)精度有影響
*** 入 口: Handler:句柄
*** 出 口: 1:成功 0:失敗
********************************************************************************************/
uint8 NetTimerHookDelete(int Handler)
{
uint8 i,ii,jj,MovLen;
T0TCR = 0; // 暫停計(jì)數(shù)
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; // 如果定時(shí)器中斷已停止則開(kāi)啟定時(shí)器中斷
T0TCR = 1; // 恢復(fù)計(jì)數(shù)
return 1;
}
/********************************************************************************************
*** 函數(shù)名稱(chēng):
*** 函數(shù)描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void __irq IRQ_NetTimer(void)
{
uint8 i,j;
T0TCR = 0; // 暫停計(jì)數(shù)
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,"時(shí)間坐標(biāo)響應(yīng):%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; // 恢復(fù)計(jì)數(shù)
T0IR = 0x01; // 清除中斷標(biāo)志
VICVectAddr = 0x00; // 通知VIC中斷處理結(jié)束
}
/********************************************************************************************
*** 函數(shù)名稱(chēng):
*** 函數(shù)描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
uint32 NetTimerGetTc(void)
{
uint32 tc;
T0TCR = 0;
tc = T0TC;
T0TCR = 1;
return tc;
}
/********************************************************************************************
*** 函數(shù)名稱(chēng): IpCheckSum
*** 函數(shù)描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
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) //長(zhǎng)度為單數(shù)
{
sum += ((*ptr)&0xff);
}
sum = (sum & 0xffff) + ((sum>>16)&0xffff);
if(sum&0xffff0000) sum++; //有進(jìn)位
return ((uint16)((sum)&0xffff));
}
/********************************************************************************************
*** 函數(shù)名稱(chēng): InetMemCmp
*** 函數(shù)描述: 內(nèi)存比較
*** 入 口: Memory1,Memory2:被比較的兩個(gè)內(nèi)存指針 Length:比較長(zhǎng)度
*** 出 口: 無(wú)
********************************************************************************************/
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;
}
/********************************************************************************************
*** 函數(shù)名稱(chēng): NetSystemInitial
*** 函數(shù)描述: 網(wǎng)絡(luò)協(xié)議初始化
*** 入 口: 無(wú)
*** 出 口: 無(wú)
********************************************************************************************/
void NetSystemInitial(void)
{
ModemInit("56000");
NetTimerInit();
LinkLayerInit();
NetLayerInit();
UdpInit();
TcpInitial();
}
/********************************************************************************************
*** 文件結(jié)束 ***
********************************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -