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

📄 main.c

📁 实验开发箱中自带的UCOS嵌入式系统实验源代码
💻 C
字号:
#include"..\ucos-ii\includes.h"               /* uC/OS interface */
#include "..\ucos-ii\add\osaddition.h"
#include "..\inc\TCPIP\internet.h"
#include "..\inc\drv.h"
#include "..\inc\drv\tchscr.h"
#include <string.h>
struct sockaddr_in servaddr;//计算机端套接口
int nNode;

///******************任务定义***************///
OS_STK Main_Stack[STACKSIZE*8]={0, };   //Main_Test_Task堆栈
void Main_Task(void *Id);             //Main_Test_Task
#define Main_Task_Prio     12

OS_STK Receive_Stack[STACKSIZE*8]={0, };   //Main_Test_Task堆栈
void Receive_Task(void *Id);             //Main_Test_Task
#define Receive_Task_Prio     40

/**************已经定义的OS任务*************
tcp监控任务		11
以太网物理层监控任务	8
触摸屏任务		9
键盘任务		10
lcd刷新任务		59
系统任务		1
*****************************************************/

///*****************事件定义*****************///
OS_EVENT *Nand_Rw_Sem;                   //Nand_Flash读写控制权旗语
//and you can use it as folloeing:
//    Nand_Rw_Sem=OSSemCreate(1);        //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//
//    OSSemPend(Nand_Rw_Sem,0,&err);
//    OSSemPost(Nand_Rw_Sem);

OS_EVENT *Uart_Rw_Sem;                   //Uart读写控制权旗语
//and you can use it as folloeing:
//    Uart_Rw_Sem=OSSemCreate(1);        //创建Uart读写控制权旗语,初值为1满足互斥条件//
//    OSSemPend(Uart_Rw_Sem,0,&err);
//    OSSemPost(Uart_Rw_Sem);
//////////////////////////////////////////////////////////

void initOSGUI()	//初始化操作系统的图形界面
{
	initOSMessage();
	initOSList();
	initOSDC();
	initOSCtrl();
	initOSFile();
}

extern U8 isConfigsysLoad;
extern U8 sysCONFIG[];
extern U32 ConfigSysdata[];

void InitNetWork()//初始化网络
{
	U32 ipaddr32,ipmaskaddr32,ipgateaddr32;
	U8 Mac[6];
	
	Uart_Printf("begin init Ethernet and UDP...\n");

	if(isConfigsysLoad){//config.sys文件调用成功则对网络应用其设置
		memcpy(Mac, ConfigSysdata+4, 6);//网卡地址
		ipaddr32=ConfigSysdata[6];//ip地址
		ipmaskaddr32=ConfigSysdata[7];//子网掩码
		ipgateaddr32=ConfigSysdata[8];//网关
		Uart_Printf("current IP is %d.%d.%d.%d", ipaddr32&0xff,(ipaddr32>>8)&0xff,(ipaddr32>>16)&0xff,ipaddr32>>24);
	}
	else	{//config.sys文件调用不成功,则使用默认配置
		IP4_ADDRESS32(ipaddr32,192,168,0,1);
		IP4_ADDRESS32(ipmaskaddr32,255,255,255,0);
		IP4_ADDRESS32(ipgateaddr32,192,168,1,254);
		Uart_Printf("current IP is 192.168.0.1");
	}

	initOSNet(ipaddr32, ipmaskaddr32, ipgateaddr32, Mac);//配置网络
	OSTimeDly(5000);//任务挂起5秒
	Uart_Printf("init Ethernet and UDP is ok!\n");
}

/////////////////////////////////////////////////////
//                  Main function.                //
////////////////////////////////////////////////////

int Main(int argc, char **argv)
{
	ARMTargetInit(); //开发板初始化
	OSInit(); //操作系统初始化      
	uHALr_ResetMMU();//复位MMU
	LCD_Init();             //初始化LCD模块
	LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据
	LCD_printf("320 x 240  Text Mode\n");
	initOSGUI();//初始化图形界面
	LoadFont();//调Unicode字库
	LoadConfigSys();//使用config.sys文件配置系统设置
	LCD_printf("Create task on uCOS-II...\n");
	OSTaskCreate(Main_Task,  (void *)0,  (OS_STK *)&Main_Stack[STACKSIZE*8-1],  Main_Task_Prio);// 创建系统任务
	OSTaskCreate(Receive_Task,  (void *)0,  (OS_STK *)&Receive_Stack[STACKSIZE*8-1],  Receive_Task_Prio);
	OSAddTask_Init();//创建系统附加任务
	LCD_printf("Starting uCOS-II...\n");
	LCD_printf("Entering graph mode...\n");
	LCD_ChangeMode(DspGraMode);//变LCD显示模式为文本模式
	InitRtc();//初始化系统时钟
	Nand_Rw_Sem=OSSemCreate(1);   //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//
	OSStart();//操作系统任务调度开始
	//不会执行到这里
	return 0;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Main_Task(void *Id)             //Main_Test_Task
{
	POSMSG pMsg;//定义消息结构
	PDC pdc;//定义绘图设备上下文结构
	struct point{
		   int x;
		   int y;
		};//定义点坐标结构
	int ClientSock_out;		
	struct sockaddr_in cliaddr_out;//IPv4套接口地址定义
	struct point scrpoint;//触摸点
   
	InitNetWork();
	ClientSock_out=socket(PF_INET,SOCK_DGRAM, 0);//创建套接字
       memset(&servaddr, 0, sizeof(servaddr)); //地址结构清零
	memset(&cliaddr_out, 0, sizeof(cliaddr_out)); //地址结构清零
	//计算机终端套接字属性
	servaddr.sin_family = AF_INET; //IPv4协议
	//servaddr.sin_addr.s_addr = (118<<24)|(0<<16)|(168<<8)|192;
	servaddr.sin_port = htons(5000); //端口
	//发送端套接字属性?	cliaddr_out.sin_family = AF_INET; //IPv4协议
	cliaddr_out.sin_port=htons(4999);
	cliaddr_out.sin_addr.s_addr=INADDR_ANY;
       bind(ClientSock_out, (struct sockaddr*)&cliaddr_out, sizeof(cliaddr_out));//绑定套接字
    
	ClearScreen();//清屏
       pdc=CreateDC();//创建绘图设备上下文
	for(;;){
		pMsg=WaitMessage(0);//等待消息
	       switch(pMsg->Message){
			case OSM_TOUCH_SCREEN://OSM_TOUCH_SCREEN:
				switch(pMsg->LParam){
					case TCHSCR_ACTION_DOWN:
						scrpoint.x=-1;//表示触摸屏按下
						//发送两遍是为了确保计算机能够收到
						sendto(ClientSock_out, (struct point*)&scrpoint, sizeof(struct point), 0, (struct sockaddr*)&servaddr, sizeof(servaddr));
						sendto(ClientSock_out, (struct point*)&scrpoint, sizeof(struct point), 0, (struct sockaddr*)&servaddr, sizeof(servaddr));
						//获得触摸点坐标
						scrpoint.x=pMsg->WParam&0x0000ffff;
						scrpoint.y=pMsg->WParam>>16;
						sendto(ClientSock_out, (struct point*)&scrpoint, sizeof(struct point), 0, (struct sockaddr*)&servaddr, sizeof(servaddr));
						MoveTo(pdc, scrpoint.x, scrpoint.y);//移动
                            		break;
					case TCHSCR_ACTION_MOVE:
						scrpoint.x=pMsg->WParam&0x0000ffff;
						scrpoint.y=pMsg->WParam>>16;
	                     		sendto(ClientSock_out, (struct point*)&scrpoint, sizeof(struct point), 0, (struct sockaddr*)&servaddr, sizeof(servaddr));
	                     		LineTo(pdc, scrpoint.x, scrpoint.y);//画线
	                     		break;
				}
				break;
	                     
           }
           
		DeleteMessage(pMsg);//删除消息
              OSTimeDly(200);
	}
	DestoryDC(pdc);//删除绘图设备上下文
	close(ClientSock_out);//关闭套接字
}

void Receive_Task(void *Id)             //Main_Test_Task
{
	int ClientSock_in;
	struct sockaddr_in cliaddr_in;
	int iRecv;
	BOOLEAN IsClearn;
	int fromlen;
	fromlen=sizeof(cliaddr_in);
	//接收端套接口属性
	cliaddr_in.sin_family= AF_INET; 
       cliaddr_in.sin_port=htons(4998);
       cliaddr_in.sin_addr.s_addr=INADDR_ANY;
	ClientSock_in=socket(PF_INET,SOCK_DGRAM, 0);
	bind(ClientSock_in, (struct sockaddr*)&cliaddr_in, sizeof(cliaddr_in));
	for(;;){
		//接收清屏命令
		iRecv=recvfrom(ClientSock_in, (BOOLEAN*)&IsClearn, sizeof(int), 0, (struct sockaddr*)&cliaddr_in, (int*)&fromlen);
		servaddr.sin_addr.s_addr=cliaddr_in.sin_addr.s_addr;//得到计算机端IP
		if(IsClearn){
			ClearScreen();
			}
		OSTimeDly(300);
		}
	close(ClientSock_in);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -