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

📄 main.c

📁 uCOS-II下实现的lwip协议栈实现Ping功能
💻 C
字号:
/**************************************************
**	文件名:main.c
**	版本号:V 1.0
**	版权说明:本源码由天嵌科技编写并维护。
**	文件说明:自定义的主函数,当汇编部分执行完成后,
**		跳转到本文件的main函数中,完成对uCOS-II的任务初始化等,
**		最后调用任务管理器,并开始任务调用。
***************************************************/

#include "config.h"
#include "sys_arch.h"
#include "dm9000x.h"
#include "lwip/sys.h"
#include "lwip/api.h"
#include "lwip/sockets.h"
extern void DM9k_init(void);
//extern void Lcd_Display(void);

void Task_LCD(void *p);

/*****************【任务相关自定义变量】*****************/
OS_STK  MainTaskStk[MainTaskStkLengh];
OS_STK	Task0Stk [Task0StkLengh];       // Define the Task0 stack 
OS_STK	Task1Stk [Task1StkLengh];       // Define the Task1 stack 
OS_STK	Task2Stk [Task2StkLengh];       // Define the Task2 stack 

OS_EVENT *Semp;                         //Creat semp

U8 err;
int rYear, rMonth,rDay,rDayOfWeek,rHour,rMinute,rSecond;
//建立一个任务用变量,实现该任务第一次运行时,就需要初始化,之后再运行该任务时则不需要进行初始化
int user_task0_firstboot = 1;
int user_task1_firstboot = 1;
int user_task2_firstboot = 1;

int Main(int argc, char **argv)
{
	//初始化目标板
	TargetInit(); 

	//初始化uCOS-II
	OSInit ();	 

	//初始化系统时基
	OSTimeSet(0);

	//创建系统初始任务
	OSTaskCreate (MainTask,(void *)0, &MainTaskStk[MainTaskStkLengh - 1], MainTaskPrio);

	//开始任务
	OSStart ();

	return 0;
}

void MainTask(void *pdata) //Main Task create taks0 and task1
{
	#if OS_CRITICAL_METHOD == 3		/* Allocate storage for CPU status register */
		OS_CPU_SR  cpu_sr;
	#endif
	OS_ENTER_CRITICAL();

	Timer0Init();		//initial timer0 for ucos time tick
	ISRInit();			//initial interrupt prio or enable or disable

	OS_EXIT_CRITICAL();

	OSPrintfInit();		//use task to print massage to Uart 

	OSStatInit();
	OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], Task0Prio);
	//OSTaskCreate (Task1,(void *)0, &Task1Stk[Task1StkLengh - 1], Task1Prio);
	//OSTaskCreate (Task2,(void *)0, &Task2Stk[Task2StkLengh - 1], Task2Prio);
	OSTaskDel(OS_PRIO_SELF);
		
	
}


void Task0(void *pdata)				//任务0,打印CPU占用率
{
	int server;
	U32 conn_val = 0;
	int sendsize;
	char ch[]="net test!";
	struct sockaddr_in server_address;
	//DM9k_init();
	
		
	InitLwIP();

	//* 设置LwIP,主要是设置网络接口、建立接收任务等诸如此类的初始设置工作
	SetupLwIP();
	
	Uart_SendString("lwip setup ok!\n");
	//dm9000_init();
	//rGPFDAT = 0x1E0;				//全灭
	//server = socket(AF_INET, SOCK_DGRAM, 0);
	//Uart_Printf("server_sock is %d\n",server);	
	//server_address.sin_family=AF_INET;
	//server_address.sin_addr.s_addr=inet_addr("127.0.0.1");
	//server_address.sin_addr.s_addr=inet_addr("192.168.192.239");//htonl(INADDR_ANY);
	//server_address.sin_port=htons(6000);
	//server_len=sizeof(server_address);
	
	while (1) {
		//rGPFDAT ^= (1 << 4);				//LED1
		//sendsize = sendto(server,ch,sizeof(ch),0,(struct sockaddr *)&server_address,sizeof(server_address));
		//Uart_Printf("sendsize is %d \n",sendsize);
		//sendsize = write(server_sockfd,&ch,sizeof(ch));
		/*Uart_SendString("enter in socket create!\n");
			if ((server = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
   		{ 	
   			Uart_SendString("create socket failed!\n");
       		//return; 
   		} 
   		else
   		{
   		Uart_SendString("create socket OK\n");
   		}
   		*/
   		//conn_val = connect(server, (struct sockaddr *)&server_address, sizeof(server_address));
		//Uart_Printf("conn_val = %d\n",conn_val);
		//Uart_SendString("enter in task0!\n");
		//OSTimeDly(OS_TICKS_PER_SEC);
		OSTaskSuspend(OS_PRIO_SELF);
	}
}

void Task1(void *pdata)				//任务1,控制LED灯亮,开启蜂鸣器同时鸣叫
{
	U16 task1Cnt=0;

	if (user_task1_firstboot == 1) {
		// RTC初始化
		Rtc_Init();
		user_task1_firstboot = 0;
	}

	while (1) {
		task1Cnt++;
		
		rGPFDAT ^= (1 << 5);				//LED2
		
		OSPrintf("\nEnter Task1\n");
		OSPrintf("uC/OS Version:V%4.2f\n",(float)OSVersion()*0.01);//打印uC/OS的版本号 

		//实现流水灯
		//if((task1Cnt%5) == 0)
		//	rGPBDAT = 0x1E0;				//全灭
		//else
		//	rGPBDAT = rGPBDAT - (0x10<<(task1Cnt%5));	//流水灯

		//蜂鸣器鸣叫
		//Beep(3000, 60);
		//Beep(2500, 60);
		//Beep(2000, 60);
		//Beep(1500, 60);
		//Beep(1000, 60);
		//Beep(900, 60);
		OSTimeDly(OS_TICKS_PER_SEC*5);
	}
}

void Task2(void *pdata)
{
	unsigned int i, x, m, n, k, y;
	int tmp,key;         

	int width = 10;
	int height = 100;

	if (user_task2_firstboot == 1) {
		//LCD 初始化
		Lcd_Display();
		user_task2_firstboot = 0;
	}

	while(1) {
		i++;
		if(i>99)i=0;

		if (rBCDYEAR == 0x99) {
			rYear = 1999;
		}	else {
			rYear    = (2000 + rBCDYEAR);
			rMonth   = FROM_BCD(rBCDMON & 0x1f);
			rDay		= FROM_BCD(rBCDDAY & 0x03f);
			rDayOfWeek = rBCDDATE - 1;
			rHour    = FROM_BCD(rBCDHOUR & 0x3f);
			rMinute     = FROM_BCD(rBCDMIN & 0x7f);
			rSecond     = FROM_BCD(rBCDSEC & 0x7f);
		}
		OSTimeDly( 5 );
		
		rGPFDAT ^= (1 << 6);				//LED3
		
		//OSPrintf("时间:%4d-%02d-%02d 星期%d  %02d:%02d:%02d\n",
        //	      rYear, rMonth, rDay,rDayOfWeek, rHour, rMinute, rSecond);	
		//OSPrintf("LCD display Test!\n\n");	
/*
		//在LCD上打印日期,星期,时间
		Lcd_printf(0,65,RGB( 0xFF,0xFF,0xFF),RGB( 0x00,0x00,0x00),0,"时间:%4d-%02d-%02d 星期%d  %02d:%02d:%02d\n",
        	      rYear, rMonth, rDay,rDayOfWeek, rHour, rMinute, rSecond);

		Lcd_printf(84,92,RGB( 0xFF,0xFF,0xFF),RGB( 0x00,0x00,0x00),1," uC/OS2任务演示");
		Lcd_printf(89,122,RGB( 0xFF,0xFF,0xFF),RGB( 0x00,0x00,0x00),0,"任务 计数中:%02d" , i);
*/
		OSTimeDly(OS_TICKS_PER_SEC/5);
	}
}

#if 0
void Task1(void *pdata)				//任务1,控制LED灯亮,开启蜂鸣器同时鸣叫
{
	while (1)
	{
		rGPFDAT ^= (1 << 5);				//LED4
		OSTimeDly(OS_TICKS_PER_SEC);
	}
}

void Task2(void *pdata)
{
	while(1)
	{
		rGPFDAT ^= (1 << 6);				//LED4
		OSTimeDly(OS_TICKS_PER_SEC*2);
	}
}

void Task0(void *pdata)				//任务0,打印CPU占用率
{
	while (1)
	{
		OSPrintf("\nEnter Task0\n");
		OSPrintf("CPU Usage: %d%%\n",OSCPUUsage); //打印CPU占用率,调用系统变量实现

		OSTimeDly(OS_TICKS_PER_SEC);
	}
}
#endif

⌨️ 快捷键说明

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