📄 main.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* EXAMPLE #3
*********************************************************************************************************
*/
//#include "includes.h" //change by cmj ,includes => config
#include "config.h"
#include "../include/cfg_net.h"
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
#define SOCKET_ERROR 0xFF
#define SOCKET_RCV_ERROR 0xFF
#define TASK_START_ID 0 /* Application tasks */
#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 /* Application tasks priorities */
#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 /* Size of message queue used in example */
#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 Timer1_Init(void);
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;
}
}
}
uint16 regphy1[25];
uint8 MCU_IP[4] = {192,168,0,178}; // 设置MCU的IP地址等信息
uint8 MCU_Mark[4] = {255,255,255,0};
uint8 MCU_GateWay[4] = {192,168,0,254};
/****************************************************************************
** 任务名称: Task_Server
** 任务功能: 建立一个TCP服务器进程,完成数据回发功能
*****************************************************************************/
void task0(void *pdata)
{
/*在第1个任务中设置定时器0及中断*/
//extern uint32 ReadPHY( uint32 PHYReg );
uint32 j;
UBYTE iii;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
TargetInit(); //add by cmj
//UBYTE EX_RAM *er;
OSTaskCreateExt(TaskB,
(void *)0,
&task1_stack[399],
TASK_1_PRIO,
TASK_1_ID,
&task1_stack[0],
400,
(void *)0,//&TaskUserData[TASK_4_ID]
0);
OSTaskCreateExt(TaskC,
(void *)0,
&task2_stack[399],
TASK_2_PRIO,
TASK_2_ID,
&task2_stack[0],
400,
(void *)0,//&TaskUserData[TASK_4_ID]
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)
{
//for(i = 0; i<25; i++)
// regphy1[i] = ReadPHY(i);
j=0;
}
}//end for while(1)
}
/****************************************************************************
** 任务名称: 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); //RTL8019芯片初始化,在global.c中定义
Initial_arp();
Tcp_Initial();
Udp_Initial();
}
void Uart_SendChar(INT8U data)
{
while((U0LSR & 0x00000020) == 0);
U0THR = data;
}
/**********************************************************************************************************
* MAIN
**********************************************************************************************************/
int main (void)
{
//UBYTE iii;
Timer1_Init();
OSInit(); /* Initialize uC/OS-II */
OSTaskCreateExt(task0,
(void *)0,
&task0_stack[399],
TASK_START_PRIO,
TASK_START_ID,
&task0_stack[0],
400,
(void *)0,//&TaskUserData[TASK_4_ID]
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);
U0TER = 'S';
U0TER = 'T';
U0TER = 'A';
U0TER = 'R';
U0TER = 'T';
U0TER = '.';
U0TER = '.';
U0TER = '.';
/*
for(iii=0;iii<MAX_TCP_LINKS;iii++)
{
AppSemSend[iii]= OSSemCreate(0);
AppSemCon[iii]= OSSemCreate(0);
AppSemDisc[iii]= OSSemCreate(0);
}
*/
OSStart(); /* Start multitasking */
}
/*********************************************************************************************************
** 函数名称: Timer1_Init()
** 函数功能: 定时器1初始化
********************************************************************************************************/
void Timer1_Init(void)
{
OS_ENTER_CRITICAL();
T1IR = 0xffffffff;
T1TC = 0;
T1TCR = 0x01;
T1MCR = 0x03;
T1MR0 = 0xffffff;//(Fpclk / OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** 函数名称: Timer1()
** 函数功能: 定时器1中断处理函数
********************************************************************************************************/
void Timer1(void)
{
static uint8 m_10sec=0;
static uint8 p_sec=0;
static uint8 p_min=0;
uint8 num;
OS_ENTER_CRITICAL();
T1IR = 0x01;
//T0MR0 += (Fpclk / OS_TICKS_PER_SEC);
m_10sec++;
if(m_10sec==100)
{
p_sec++;
m_10sec=0;
if(Ping_IP_TTL>0)
Ping_IP_TTL--;
for(num=0;num<MAX_NET_PORT;num++)
{
for(p_min=0;p_min<MAX_ARP_TERM;p_min++)
{
if(NetPort[num].ARP_TERM[p_min].TTL>0)
NetPort[num].ARP_TERM[p_min].TTL--;
}
if(Gateway_IP_TTL>0)
NetPort[num].Gateway_IP_TTL--;
}
if(p_sec==60)
{
p_min++;
p_sec=0;
if(p_min==60)
{
p_min=0;
}
}
}
VICVectAddr = 0; // 通知中断控制器中断结束
OS_EXIT_CRITICAL();
//OSTimeTick();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -