📄 main.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: 测试TCP,完成数据回发。
**
**--------------------------------------------------------------------------------------------------------
** Created by:
** Created date: 2007-3-26
** Version: 1.0
** Descriptions: 测试TCP,完成数据回发。
**--------------------------------------------------------------------------------------------------------
** Modified by: zhangjunjie
** Modified date: 2008-04-24
** Version: 1.1
** Descriptions: 对程序的风格以及注释略作调整,并检查代码。
**
** Rechecked by: Litiantian
*********************************************************************************************************/
#include "config.h"
#include "../include/cfg_net.h"
/*********************************************************************************************************
任务ID、优先级、堆栈设置及函数声明
*********************************************************************************************************/
#define SOCKET_ERROR 0xFF
#define SOCKET_RCV_ERROR 0xFF
#define TASK_START_ID 0
#define TASK_1_ID 1
#define TASK_2_ID 2
#define TASK_3_ID 3
#define TASK_4_ID 4
#define TASK_SERVER_ID 5
#define TASK_6_ID 6
#define TASK_START_PRIO 10
#define TASK_1_PRIO 11
#define TASK_2_PRIO 12
#define TASK_3_PRIO 13
#define TASK_4_PRIO 14
#define TASK_SERVER_PRIO 15
#define TASK_6_PRIO 16
#define MSG_QUEUE_SIZE 20
#define Stack_Size 512
OS_EVENT *RecPackedFlag;
OS_EVENT *RecBufOverFlowFlag;
OS_EVENT *RecTcpPackedFlag;
OS_EVENT *RecPingPackedFlag;
OS_STK task0_stack[400];
OS_STK task1_stack[400];
OS_STK task2_stack[400];
OS_STK task3_stack[400];
OS_STK task4_stack[400];
OS_STK Task_Server_stack[Stack_Size];
void Task_Server(void *pdata);
void ZlgipInitial(uint8* MCU_IP,uint8* MCU_GateWay,uint8* MCU_Mark);
/*********************************************************************************************************
** 任务名称: TaskB
** 任务功能: UDP处理
*********************************************************************************************************/
void TaskB(void *pdata)
{
void * UdpTemp;
uint8 eer;
while (1)
{
UdpTemp=OSQPend(RecUdpQFlag,0,&eer);
if(eer==OS_NO_ERR)
{
Udp_Process((Rec_Ptr *)UdpTemp);
eer=eer;
}
}
}
/*********************************************************************************************************
** 任务名称: TaskC
** 任务功能: TCP处理
*********************************************************************************************************/
void TaskC(void *pdata)
{
void * TcpTemp;
uint8 err;
while (1)
{
TcpTemp=OSQPend(RecTcpQFlag,0,&err);
if(err==OS_NO_ERR)
{
Process_Tcp1((Rec_Ptr *)TcpTemp);
TcpTemp=TcpTemp;
}
}
}
uint8 MCU_IP[4] = {192,168,1,2}; /* 设置MCU的IP地址等信息 */
uint8 MCU_Mark[4] = {255,255,255,0};
uint8 MCU_GateWay[4] = {192,168,1,161};
/*********************************************************************************************************
** 任务名称: Task_Server
** 任务功能: 建立一个TCP服务器进程,完成数据回发功能
*********************************************************************************************************/
void task0(void *pdata)
{
uint32 j;
UBYTE iii;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
TargetInit(); /* 板卡初始化 */
OSTaskCreateExt(TaskB, /* 创建任务B */
(void *)0,
&task1_stack[399],
TASK_1_PRIO,
TASK_1_ID,
&task1_stack[0],
400,
(void *)0,
0);
OSTaskCreateExt(TaskC, /* 创建任务C */
(void *)0,
&task2_stack[399],
TASK_2_PRIO,
TASK_2_ID,
&task2_stack[0],
400,
(void *)0,
0);
ZlgipInitial(MCU_IP,MCU_GateWay,MCU_Mark);
OSTaskCreateExt(Task_Server, /* 创建服务任务 */
(void*)0,
&Task_Server_stack[Stack_Size-1],
TASK_SERVER_PRIO,
TASK_SERVER_ID,
&Task_Server_stack[0],
Stack_Size,
(void*)0,
0);
j = 0;
while(1)
{
OSSemPend(RecPackedFlag,100,&iii);
do
{
iii=Rec_Packet();
}
while(iii!=0);
j++;
if (j >= 100)
{
j=0;
}
}
}
/*********************************************************************************************************
** 任务名称: Task_Server
** 任务功能: 建立一个TCP服务器进程,完成数据回发功能
*********************************************************************************************************/
void Task_Server(void *pdata)
{
SOCKET* s;
int ei; /* 存放返回值的变量 */
int RecvCnt=0; /* 接收数据个数 */
uint8 RecvBuff[200]; /* 接收缓冲区 */
struct sockaddr serveraddr,clientaddr; /* sockaddr 结构体由协议栈类型、
IP和端口组成 */
serveraddr.sin_family = 0; /* 协议栈类型 */
serveraddr.sin_addr[0] = MCU_IP[0]; /* 四位IP地址 */
serveraddr.sin_addr[1] = MCU_IP[1];
serveraddr.sin_addr[2] = MCU_IP[2];
serveraddr.sin_addr[3] = MCU_IP[3];
serveraddr.sin_port = 4000; /* 服务器本地端口 */
s = socket(AF_INET,SOCK_STREAM,TCP_PROTOCOL); /* 创建一个套接字 */
ei = bind(s,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); /* 绑定IP和端口到socket */
ei = listen(s,1); /* 设置监听最大连接数 */
while(1)
{
ei = accept(s,(struct sockaddr *)&clientaddr,(int*)sizeof(clientaddr));
/* 等待客户机连接 */
if(ei!=SOCKET_ERROR)
{
while(getsocktcpsta(ei) ==3) /* 连接状态 */
{
RecvCnt=recv(ei,RecvBuff,200,0); /* 接收客户机发送来的数据 */
if(RecvCnt == SOCKET_RCV_ERROR) /* 如果接收返回值指示错误 */
{
break;
}
else if(RecvCnt>0)
{
send(ei,RecvBuff,RecvCnt,0); /* 将数据回送给客户机 */
}
OSTimeDly(30);
}
close(ei); /* 关闭连接 */
OSTimeDly(100);
TCP_Abort(ei); /* 释放连接资源 */
}
OSTimeDly(40);
}
}
/*********************************************************************************************************
** 任务名称: ZlgipInitial()
** 任务功能: 初始化ZLGip
*********************************************************************************************************/
void ZlgipInitial(uint8* MCU_IP,uint8* MCU_GateWay,uint8* MCU_Mark)
{
SetNetPort(MCU_IP,MCU_GateWay,MCU_Mark);
InitNic(0);
Initial_arp();
Tcp_Initial();
Udp_Initial();
}
/*********************************************************************************************************
** 任务名称: main()
** 任务功能: 用户程序入口函数
*********************************************************************************************************/
int main (void)
{
OSInit(); /* 操作系统初始化 */
OSTaskCreateExt(task0,
(void *)0,
&task0_stack[399],
TASK_START_PRIO,
TASK_START_ID,
&task0_stack[0],
400,
(void *)0,
0);
RecPackedFlag= OSSemCreate(0);
RecBufOverFlowFlag= OSSemCreate(0);
RecTcpPackedFlag= OSSemCreate(0);
RecPingPackedFlag= OSSemCreate(0);
SendFlag= OSSemCreate(1);
RecIcmpQFlag= OSQCreate(&RecIcmpQ[0],Q_Max_Size);
RecTcpQFlag= OSQCreate(&RecTcpQ[0],Q_Max_Size);
RecUdpQFlag= OSQCreate(&RecUdpQ[0],Q_Max_Size);
OSStart(); /* 启动多任务操作系统 */
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -