📄 tcpip_main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: tcpip_main.c
** Last modified Date: 2004-11-25
** Last Version: 1.0
** Descriptions: zlgio initial function and handle task function file
**------------------------------------------------------------------------------------------------------
** Created by: Yehaoben
** Created date: 2004-11-25
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#define TCPIP_INIT_GLOBALS
#include "config.h"
#define NET_TASK_START_ID 0 /* Application tasks */
#define TASK_TCP_ID 1
#define NET_TASK_START_PRIO 0 /* Application tasks priorities */
#define TASK_TCP_PRIO 1
#define NET_TASK_STACK_SIZE 500 /* Size of task stack */
#define TASK_TCP_STACK_SIZE 500
uint8 My_Ip_1ID[4]=MY_IP_1ID;
uint8 My_Gateway_1ID[4]=MY_GATEWAY_1ID;
uint8 MY_IP_MARK_1ID[4]=IP_MARK_1ID;
uint8 MY_MAC_1ID[6]=My_Mac_1ID;//MAC地址
#if (MAX_NET_PORT>=2)
uint8 My_Ip_2ID[4]=MY_IP_2ID;
uint8 My_Gateway_2ID[4]=MY_GATEWAY_2ID;
uint8 MY_IP_MARK_2ID[4]=IP_MARK_2ID;
uint8 MY_MAC_2ID[6]=My_Mac_2ID;//MAC地址
#endif
OS_STK net_task_stack[NET_TASK_STACK_SIZE];
OS_STK task_tcp_stack[TASK_TCP_STACK_SIZE];
OS_EVENT *RecPackedFlag;
OS_EVENT *RecTcpPackedFlag;
void Timer1_Init(void);
void SetNetPort(void);
void NetTimeHandle(void);
/*********************************************************************************************************
** Network Recive Task 网络数据接收任务
********************************************************************************************************/
uint16 MAXST[5];
OS_STK_DATA data;
void Task_Net_Rec(void *pdata)
{
uint8 iii,err,i;
#if ZNE_WDT_EN > 0
extern void WDT_FEED(void);
#endif
while(1)
{
OSTimeDly(4);
do
{
iii=Rec_Packet(0);
#if ZNE_WDT_EN > 0
WDT_FEED();
#endif
}// end of do
while(iii!=0);
NetTimeHandle();
for (i = 0; i < 5; i++) {
err = OSTaskStkChk(NET_TASK_START_ID + i, &data);
if (err == OS_NO_ERR) {
if(data.OSUsed>MAXST[i])
MAXST[i]=data.OSUsed;
}
}
}//end for while(1)
}
/*********************************************************************************************************
** Network Tcp Handle Task 网络TCP处理任务
********************************************************************************************************/
void Task_Tcp_Handle(void *pdata)
{
void * TcpTemp;
uint8 err;
while (1)
{
TcpTemp=OSQPend(RecTcpQFlag,1000,&err);
if(err==OS_NO_ERR)
{
Process_Tcp((Rec_Ptr *)TcpTemp);
}
else if((err==OS_TIMEOUT))
{
Send_DHCPDISCOVER();
}
}
}
/*********************************************************************************************************
** Function name: ZlgipInitial
**
** Descriptions: Zlgip Initial function
**
** input parameters: None
** Returned value: None
**
** Used global variables: None
** Calling modules: None
**
** Created by: Yehaoben
** Created Date: 2004/02/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ZlgipInitial(void)
{
Timer1_Init();
SendFlag= OSSemCreate(1);
RecTcpQFlag= OSQCreate(&RecTcpQ[0],Q_Max_Size);
SetNetPort();
InitNic(0);
Initial_arp(0);
#if MAX_NET_PORT>=2
InitNic(1); //RTL8019芯片初始化,在global.c中定义
Initial_arp(1);
#endif
TCP_Initial();
Udp_Initial();
DHCP_Initial();
OSTaskCreateExt(Task_Net_Rec,
(void *)0,
&net_task_stack[NET_TASK_STACK_SIZE-1],
NET_TASK_START_PRIO,
NET_TASK_START_ID,
&net_task_stack[0],
NET_TASK_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task_Tcp_Handle,
(void *)0,
&task_tcp_stack[TASK_TCP_STACK_SIZE-1],
TASK_TCP_PRIO,
TASK_TCP_ID,
&task_tcp_stack[0],
TASK_TCP_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
}
/*********************************************************************************************************
** Function name: NetTimeHandle
**
** Descriptions: Zlgip time handle,such as TTL
**
** input parameters: None
** Returned value: None
**
** Used global variables: ttl_flag,NetPort
** Calling modules: Arp_Request
**
** Created by: Yehaoben
** Created Date: 2004/02/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
volatile uint8 ttl_flag;
void NetTimeHandle(void)
{
uint8 num,iii;
if(ttl_flag>0)
{
num=0;
#if MAX_NET_PORT>=2
for(num=0;num<MAX_NET_PORT;num++)
{
#endif
for(iii=0;iii<MAX_ARP_TERM;iii++)
{
if(NetPort[num].ARP_TERM[iii].TTL>0)
NetPort[num].ARP_TERM[iii].TTL--;
}
if(NetPort[num].Gateway_IP_TTL>0)
NetPort[num].Gateway_IP_TTL--;
#if MAX_NET_PORT>=2
}
#endif
if(NetPort[num].Gateway_IP_TTL>0)
{
NetPort[num].Gateway_IP_TTL--;
if(NetPort[num].Gateway_IP_TTL==0)
Arp_Request(NetPort[num].My_Gateway,num);
}
ttl_flag=0;
}
TimeWaitTimeOut();
}
/*********************************************************************************************************
** Function name: Timer1_Init
**
** Descriptions: time1 Initial function
**
** input parameters: None
** Returned value: None
**
** Used global variables: None
** Calling modules: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** Created by: Yehaoben
** Created Date: 2004/02/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 Timer1PerTime;
uint8 Timer1PerSec;
uint8 Timer1Per10S;
void Timer1_ISR(void)
{
rSRCPND = 1 << 11;
rINTPND = rINTPND;
Timer1PerTime++;
if(Timer1PerTime >= (OS_TICKS_PER_SEC / 4))
{
Timer1PerSec++;
Timer1PerTime = 0;
DHCP_RTC_HANDLE();
}
if(Timer1PerSec >= 10)
{
Timer1PerSec = 0;
ttl_flag = 1;
}
}
void Timer1_Init(void)
{
OS_ENTER_CRITICAL();
// 设置中断控制器
VICVectAddr[11] = (uint32) Timer1_ISR;
rINTMSK &= ~(1<<11); // 打开TIMER0中断允许
rTCFG1 = rTCFG1 | 0X30; // TIMER1再取1/16分频,取得12.5KHz
rTCNTB1 = (PCLK / (4 * OS_TICKS_PER_SEC)) - 1;
rTCON = rTCON | (1 << 9); // 更新定时器数据
rTCON = rTCON & ~(1 << 9);
rTCON = rTCON | (1 << 8) | (1 << 11); // 启动定时器
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** Function name: Timer1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -