⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 周立功单片机Sm2300开发板的TCPIP例程
💻 C
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*                          (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
*                                           All Rights Reserved
*
*                                               EXAMPLE #1
*********************************************************************************************************
*/


#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_UDP_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_UDP_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_Udp_stack[Stack_Size];

void Timer1_Init(void);
void Task_Udp(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_0
**	任务功能:	第一个运行的任务
*****************************************************************************/

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_Udp,
				 	(void*)0,
				 	&Task_Udp_stack[Stack_Size-1],
				 	TASK_UDP_PRIO,
				 	TASK_UDP_ID,
				 	&Task_Udp_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;
		}
	}
}

/*********************************************************************************************************
**	任务名称:	Task_Udp
**	任务功能:	建立一个UDP进程,完成数据回发 
********************************************************************************************************/


void Task_Udp(void *pdata)
{
	struct sockaddr  serveraddr,clientaddr;
	SOCKET* s; 	
	uint16 ei;
	uint32 DataLen;
   	uint8 UdpDataBuff[1000];
	pdata =pdata;
	clientaddr.sin_family   = 0;      					   		//设置MCU套接字结构体
	clientaddr.sin_addr[0]	= MCU_IP[0];
	clientaddr.sin_addr[1]	= MCU_IP[1];
	clientaddr.sin_addr[2]	= MCU_IP[2];
	clientaddr.sin_addr[3]	= MCU_IP[3];	    
	clientaddr.sin_port     = 5000;
	s = socket(0,SOCK_DGRAM,UDP_PROTOCOL);  					//创建UDP套接字
	ei = bind(s,&clientaddr,sizeof(clientaddr));				//绑定MCU信息到套接字 	
	while(1)
	{
		DataLen = recvfrom(*s,UdpDataBuff,sizeof(UdpDataBuff),0,(struct sockaddr *)&serveraddr,&ei);
		if(DataLen>0)
		{
			sendto(*s,UdpDataBuff,DataLen,0,&serveraddr,ei);	//UDP数据回传
		}

		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();
}
/*$PAGE*/

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 + -