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

📄 main.c

📁 SmartARM2400系列开发板全套资料
💻 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:		测试2400的网络,同时使用TCP和UDP两种协议,TCP完成HTTP连接,实现对WEB网页的访问,
**						同时建立一个绑定UDP端口,实现UDP的数据回发。
**--------------------------------------------------------------------------------------------------------
** Created by:			
** Created date:		2007-3-26
** Version:				1.0
** Descriptions:		测试2400的网络,同时使用TCP和UDP两种协议,TCP完成HTTP连接,实现对WEB网页的访问,
**						同时建立一个绑定UDP端口,实现UDP的数据回发。
**--------------------------------------------------------------------------------------------------------
** Modified by:			zhangjunjie
** Modified date:		2008-04-24
** Version:				1.1
** Descriptions:		对程序的风格以及注释略作调整,并检查代码。
**
** Rechecked by:		Litiantian	
*********************************************************************************************************/

#include "main.h"
#include "../include/cfg_net.h"


/*********************************************************************************************************
任务ID、优先级、堆栈设置及函数声明                                
*********************************************************************************************************/	


#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_5_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_5_PRIO        15
#define          TASK_6_PRIO        16

#define          MSG_QUEUE_SIZE     20 

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];

/*********************************************************************************************************
与网页有关的静态变量声明
*********************************************************************************************************/	

const uint8 httpweb[]={
    "HTTP/1.0 200 OK\r\n"
    "Date: Mon, 24 Nov 2007 01:24:17 GMT\r\n"
    "Server: microHttp/1.0 Zlgmcu Corporation\r\n"
    "Accept-Ranges: bytes\r\n"
    //"Content-Length: 116\r\n"//"Connection: Keep-Alive\r\n"
    "Connection: Keep-Close\r\n"
    "Content-Type: text/html\r\n"
    "\r\n"};
const  uint8 web[]={
 				"<HTML>\r\n"
 				"<HEAD>\r\n"
 				"<TITLE>ARM_NET演示网页(周立功单片机)</TITLE>\r\n"
 				"<BODY aLink=green background=/100.bmp bgColor=#f1f1dd link=red\r\n"
				"vLink=#321afd>\r\n"
 				"<H1>HELLO WELCOME TO EasyArm WEBSERVER</H1>\r\n"
 				"<UL>\r\n"
 				"<LI> <A HREF=\"http://www.zlgmcu.com/\">周立功单片机网站 </A>\r\n"
 				"<LI> <A HREF=\"http://www.zlg.cn/\">周立功单片机内部BBS </A>\r\n"
 				"<LI> <A HREF=\"http://www.zlgmcu.cn/\">周立功单片机 </A>\r\n"
 				"</UL>\r\n"
 				"</BODY>\r\n"
 				"</HTML>\r\n"
				};
const uint8 httpgif[]={
    "HTTP/1.0 200 OK\r\n"
    "Date: Mon, 24 Nov 2003 01:24:17 GMT\r\n"
    "Server: microHttp/1.0 Zlgmcu Corporation\r\n"
    "Accept-Ranges: bytes\r\n"
    //"Content-Length: 116\r\n"//"Connection: Keep-Alive\r\n"
    "Connection: Keep-Close\r\n"
    "Content-Type: image/bmp\r\n"
    "\r\n"};
 
const uint8 bmp[442]={
0x42,0x4d,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x28,0x00,
0x00,0x00,0x1a,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,
0x00,0x00,0x40,0x01,0x00,0x00,0xc4,0x0e,0x00,0x00,0xc4,0x0e,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80,
0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x80,
0x00,0x00,0xc0,0xc0,0xc0,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0xff,0x00,0x00,0xff,
0x00,0x00,0x00,0xff,0xff,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0xff,
0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf6,0x66,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0x66,0x66,0x6f,0x6f,0xff,0x66,0x66,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xf6,0xff,0xff,0x6f,0xf6,0xff,0xf6,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x6f,0xff,0x6f,0xf6,0xff,0xf6,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xf6,0xff,0xf6,0xf6,0xff,0xff,
0x6f,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x6f,0xf6,0xff,0x6f,0xff,
0x6f,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xf6,0x66,0x66,0xf6,0xff,0xf6,0x66,
0x6f,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00
};
 
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};

/*********************************************************************************************************
**	任务名称:	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;
	}
	
        
    }    
}

/*********************************************************************************************************
**	任务名称:	TaskD
**	任务功能:	完成UDP协议下的数据回发
*********************************************************************************************************/

void TaskD(void *pdata) 
{
uint8 add[36]={"ZLGMCUyhbabcdefghijklmnopqrstuvwxyz"};
uint8 add1[10]={"123456789"};
uint8 rec_buffer[100];
SOCKET	s; 
uint8 couter_byte=0;
int rec_coute,send_coute;
uint16 iii;
struct sockaddr servaddr,clientaddr;
	OSTimeDly(60);
	servaddr.sin_family = 0;
	servaddr.sin_addr[0] = MCU_IP[0];
	servaddr.sin_addr[1] = MCU_IP[1];
	servaddr.sin_addr[2] = MCU_IP[2];
	servaddr.sin_addr[3] = MCU_IP[3];
	servaddr.sin_port = 1025;	 
    OSTimeDly(60);
    s=*socket( 0, SOCK_DGRAM, UDP_PROTOCOL);
	iii=bind( (SOCKET * )&s, (struct sockaddr*)&servaddr,sizeof(servaddr));
    while (1)
    {
    	rec_coute=recvfrom( s, rec_buffer, 100, 0, (struct sockaddr*)&clientaddr, &iii ); 
	if(rec_coute>0)
	{
		if(rec_buffer[0]=='A')
			couter_byte=5;
		else
			send_coute=sendto(s, rec_buffer, rec_coute, 0, (struct sockaddr*)&clientaddr, sizeof(clientaddr) );
	}
	
	while(couter_byte!=0) 
	{
		send_coute=sendto(s, add, 34, 0, (struct sockaddr*)&clientaddr, sizeof(clientaddr) );
    	if(send_coute==34)
			OSTimeDly(40);
		else
			send_coute=sendto(s, add1, 9, 0, (struct sockaddr*)&clientaddr, sizeof(clientaddr) );
		OSTimeDly(40);
		couter_byte--;
	}
	  
    }    
}

/*********************************************************************************************************
**	任务名称:	TaskE
**	任务功能:	完成基于TCP的WEB功能
*********************************************************************************************************/

void TaskE(void *pdata) 
{
uint8 Temp=0;
uint16 TempLength;
int addrlen;
int ei;
unsigned char  ip_add[4]={192,168,1,2};
uint8 tempdata[400];
 
SOCKET	s; 
struct sockaddr servaddr,cliaddr;                                       /* 声明网络地址结构体           */
		Arp_Request(ip_add,0);
		OSTimeDly(60);
		servaddr.sin_family = 0;
		servaddr.sin_addr[0] = MCU_IP[0];
		servaddr.sin_addr[1] = MCU_IP[1];
		servaddr.sin_addr[2] = MCU_IP[2];
		servaddr.sin_addr[3] = MCU_IP[3];
		servaddr.sin_port = 80;		
		s=*socket( 0, 0, 0);
		ei=bind( (SOCKET * )&s, (struct sockaddr*)&servaddr,sizeof(servaddr));
		ei=listen( (SOCKET * )&s, 2 );
		if(ei!=2)
			while(1);
	while (1)
    {
		Temp=accept( (SOCKET * )&s, (struct sockaddr*)&cliaddr,&addrlen );	
		if(Temp!=0xff)
		{
			while(1)
			{
				TempLength=recv( Temp,tempdata ,400, 0 );
				if(TempLength > 0 )
				{
					if(tempdata[5]==' ')
					{
						send( Temp,(uint8 *)httpweb ,169, 0 );
						send( Temp,(uint8 *)web ,395, 0 );
					}
					else if(tempdata[5]=='1')
					{
						send( Temp, (uint8 *)httpgif,169, 0 );
						send( Temp,(uint8 *)bmp ,442, 0 );
					}
					break;
				}
				memset(tempdata, 0,400);
			}
			OSTimeDly(20);
			close(Temp);
		}
    }    
}

/*********************************************************************************************************
**	任务名称:	Task_0
**	任务功能:	第一个运行的任务
*********************************************************************************************************/

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);
        
    SetNetPort(MCU_IP,MCU_GateWay,MCU_Mark);
	InitNic(0);
	Initial_arp();
	Tcp_Initial();
 	Udp_Initial();
 	OSTaskCreateExt(TaskD,                                              /* 创建任务D                    */
                    (void *)0,
                    &task3_stack[399],
                    TASK_3_PRIO,
                    TASK_3_ID,
                    &task3_stack[0],
                    400,
                    (void *)0,
                    0);
    OSTaskCreateExt(TaskE,                                              /* 创建任务E                    */
                    (void *)0,
                    &task4_stack[399],
                    TASK_4_PRIO,
                    TASK_4_ID,
                    &task4_stack[0],
                    400,
                    (void *)0,
                    0);
 	j = 0;
  while(1)
  { 
		OSSemPend(RecPackedFlag,100,&iii);
		
		do
		{
	        iii=Rec_Packet();
	       
		}
		while(iii!=0);
		j++;
		if (j >= 100)
		{
			j=0;
		}
    }
}

/*$PAGE*/

/*********************************************************************************************************
**	任务名称:	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 + -