📄 main.c
字号:
/****************************************Copyright (c) *************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
** http://www.embedtools.com
**
**------------ File Info -------------------------------------------------------------------
** File name :main.c
** Last modified Date :
** Last Version :
** Descriptions :用户主程序
**
**------------------------------------------------------------------------------------------
** Created by:
** Created date:
** Version:
** Descriptions: 简单WEB服务器测试程序。( CF卡保存有WEB服务器的网页信息既index.htm和echo.htm )
**
**------------------------------------------------------------------------------------------
** Modified by :
** Modified date:
** Version :
** Descriptions :
**
*********************************************************************************************/
#include "main.h"
#define TASK0_PRIO 17 // 任务的优先级
#define TASK0_ID TASK0_PRIO // 任务的ID
#define TASK0_STACK_SIZE 1024 // 定义用户堆栈长度
#define TASK1_PRIO 18 // 任务的优先级
#define TASK1_ID TASK1_PRIO // 任务的ID
#define TASK1_STACK_SIZE 512 // 定义用户堆栈长度
#define TASK2_PRIO 19 // 任务的优先级
#define TASK2_ID TASK2_PRIO // 任务的ID
#define TASK2_STACK_SIZE 512 // 定义用户堆栈长度
#define TASK3_PRIO 20 // 任务的优先级
#define TASK3_ID TASK3_PRIO // 任务的ID
#define TASK3_STACK_SIZE 512 // 定义用户堆栈长度
#define TASK4_PRIO 21 // 任务的优先级
#define TASK4_ID TASK4_PRIO // 任务的ID
#define TASK4_STACK_SIZE 512 // 定义用户堆栈长度
#define TASK5_PRIO 22 // 任务的优先级
#define TASK5_ID TASK5_PRIO // 任务的ID
#define TASK5_STACK_SIZE 512 // 定义用户堆栈长度
OS_STK TASK0_STACK[TASK0_STACK_SIZE];
OS_STK TASK1_STACK[TASK1_STACK_SIZE];
OS_STK TASK2_STACK[TASK2_STACK_SIZE];
OS_STK TASK3_STACK[TASK3_STACK_SIZE];
OS_STK TASK4_STACK[TASK4_STACK_SIZE];
OS_STK TASK5_STACK[TASK5_STACK_SIZE];
void TASK0(void *pdata);
void TASK1(void *pdata);
void TASK2(void *pdata);
void TASK3(void *pdata);
void TASK4(void *pdata);
void TASK5(void *pdata);
/******************************************************************************************/
uint8 MCU_IP[4] = {192, 168, 1, 240}; // 设置MCU的IP地址等信息
uint8 MCU_Mark[4] = {255, 255, 255, 0 };
uint8 MCU_GateWay[4] = {192, 168, 1, 253};
uint8 MCU_MAC[6]; // MAC地址
uint16 MCU_Port = 80;
uint8 PC_IP[4]; // 设置PC机的IP地址等信息
uint16 PC_Port;
uint8 CFSel =0; // CF卡主从机选择
uint8 index_htm[1024*18]; // 主页缓冲区
uint8 echo_htm[1024*2]; // 刷新页面缓冲区
uint8 httpweb[] = { // http响应头信息
"HTTP/1.1 200 OK \r\n"
"Data:Wed,09 Jul 2007 12:00:00:51 GMT\r\n"
"Server: microHttp/1.0 Zlgmcu Corporation\r\n"
"Accept-Ranges: bytes\r\n"
"Content-Type:text/html\r\n"
"\r\n"
};
uint8 RcvBuff[1380];
void *Command;
HANDLE fp;
/******************************************************************************************
** Function name: main
** Descriptions : 主函数
** Input : 无
** Output : 无
*******************************************************************************************/
int main (void)
{
#if OS_CRITICAL_METHOD == 3 //Allocate storage for CPU status register
OS_CPU_SR cpu_sr;
#endif
/*---------------------- 系统初始化代码 ------------------------------------------------*/
TargetInit (); // 系统初始化,版本号验证
// 验证不通过函数不会返回!!!
DevDriveIni(); // 驱动库初始化
#if 1
//GetIpSet(MCU_IP); // 读取出厂IP
//GetMarkSet(MCU_Mark);
//GetGateWaySet(MCU_GateWay);
//MCU_Port = GetPortSet();
ZlgipInitial(MCU_IP, MCU_GateWay, MCU_Mark); // 设置系统IP参数
GetMac(MCU_MAC); // 读取MAC地址(该函数必须在ZlgipInitial后调用)
// getlocalip(MCU_IP,0); // 读取本地IP
#endif
#if 0
File_init(); // 初始化文件系统
USB_Host_init();
MassDriverIni();
#endif
#if 0
// OSAddFileDriver(GetFFSCommand(), Get16MDriverInfo()); // 安装16M (512byte扇区)电子盘文件系统驱动
OSAddFileDriver(GetLFFSCommand(), Get256MDriverInfo()); // 安装256M ( 2Kbyte扇区)电子盘文件系统驱动
#endif
/*----------------------------------------------------------------------------------------*/
File_init(); // 初始化文件系统
CFIDEInit(); // CF卡IDE接口初始化
OSAddFileDriver(GetCFCommand(), &CFSel); // 加载CF卡驱动,使用CF卡主模式
fp = OSFileOpen("index.htm","R"); // 读取主页信息
if(fp == Not_Open_FILE)
{
while(1);
}
OSFileRead((void *)index_htm, OSGetFileSize("index.htm"), fp);
OSFileClose(fp);
fp = OSFileOpen("echo.htm","R"); // 读取刷新页信息
if(fp == Not_Open_FILE)
{
while(1);
}
OSFileRead((void *)echo_htm, OSGetFileSize("echo.htm"), fp);
OSFileClose(fp);
gpio_set(BUZZER); //鸣叫BEEP
OSTimeDly(OS_TICKS_PER_SEC/10); //注意PWM输出引脚与蜂鸣器是同一引脚
gpio_clr(BUZZER);
OSTimeDly(OS_TICKS_PER_SEC/10);
gpio_set(BUZZER);
OSTimeDly(OS_TICKS_PER_SEC/10);
gpio_clr(BUZZER);
/*----------------------------------------------------------------------------------------*/
OSTaskCreateExt(TASK0,
(void *)0,
&TASK0_STACK[TASK0_STACK_SIZE-1],
TASK0_PRIO,
TASK0_ID,
&TASK0_STACK[0],
TASK0_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TASK1,
(void *)0,
&TASK1_STACK[TASK1_STACK_SIZE-1],
TASK1_PRIO,
TASK1_ID,
&TASK1_STACK[0],
TASK1_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TASK2,
(void *)0,
&TASK2_STACK[TASK2_STACK_SIZE-1],
TASK2_PRIO,
TASK2_ID,
&TASK2_STACK[0],
TASK2_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TASK3,
(void *)0,
&TASK3_STACK[TASK3_STACK_SIZE-1],
TASK3_PRIO,
TASK3_ID,
&TASK3_STACK[0],
TASK3_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TASK4,
(void *)0,
&TASK4_STACK[TASK4_STACK_SIZE-1],
TASK4_PRIO,
TASK4_ID,
&TASK4_STACK[0],
TASK4_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TASK5,
(void *)0,
&TASK5_STACK[TASK5_STACK_SIZE-1],
TASK5_PRIO,
TASK5_ID,
&TASK5_STACK[0],
TASK5_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
while (1)
{
OSTimeDly(OS_TICKS_PER_SEC);
}
}
/*******************************************************************************************
** Function name: TASK0
** Descriptions: Web服务器
** Input: 无
** Output: 无
*******************************************************************************************/
void TASK0(void *pdata)
{
uint8 ei;
uint8 Order; // TCP连接序号
int32 Tmp;
uint32 RcvNum; // 接收数据字节个数
uint32 Cnt = 1;
uint32 length; // 保存CF卡中网页的大小
uint32 Listen_Count; // 监听路数
SOCKET s;
struct sockaddr seraddr,cliaddr;
pdata = pdata;
seraddr.sin_family = 0;
seraddr.sin_addr[0] = MCU_IP[0];
seraddr.sin_addr[1] = MCU_IP[1];
seraddr.sin_addr[2] = MCU_IP[2];
seraddr.sin_addr[3] = MCU_IP[3];
seraddr.sin_port = MCU_Port;
/* 建立socket */
s = socket(0, SOCK_STREAM, TCP_PROTOCOL);
/* 绑定端口号 */
ei = bind(s,&seraddr,sizeof(seraddr));
do
{
Listen_Count = listen(s, 1); // 只监听1路
if(Listen_Count == SOCKET_ERROR)
{
OSTimeDly(20);
}
}while(Listen_Count == SOCKET_ERROR);
while (1)
{
memset(RcvBuff, 0, sizeof(RcvBuff));
Tmp = sizeof(cliaddr);
Order = accept(s, &cliaddr, &Tmp); // 接收客户端的连接
if(Order != SOCKET_ERROR) // 有用户请求连接
{
while(1)
{
RcvNum = recv(Order, RcvBuff, 1380, 0);
if(RcvNum == SOCKET_RCV_ERROR) // 连接错误,关闭连接
{
close(Order);
OSTimeDly(10);
TCP_Abort(Order);
OSTimeDly(10);
break;
}
else if(RcvNum > 0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -