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

📄 main.c

📁 基于51单片机UCOS移植
💻 C
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*                          (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
*                                           All Rights Reserved
*
*
*                                           uCOS_51 for MCS-51
*
* File : main.c
* By   : Jean J. Labrosse
* Created by : QQ 591881218
*********************************************************************************************************
*/

#include "..\ucos_51\ucos-ii\inc\includes.h"

// ---------------------------------

#define APPSTARTPRIO 	TASK_START_PRIO	
#define POWERLEDPRIO 	OS_LOWEST_PRIO-2

#define OK				0
#define ACK				1
#define ENTER			0x0D

// --------------------------------- 

sbit WorkLedCtrl=P3^4;


OS_STK AppStartStk[TASK_STK_SIZE];
OS_STK P1UpStk[TASK_STK_SIZE];
OS_STK P1DownStk[TASK_STK_SIZE];


// ---------------------------------

void AppStart(void *ppdata) REENTRANT;
void P1Up(void *ppdata) REENTRANT; 
void P1Down(void *ppdata) REENTRANT; 

void Delay(void) REENTRANT
{
	int i,j;
	for(i=0;i<200;i++)
		for(j=0;j<200;j++);
}

void DelayMS(int x) REENTRANT
{
	int i,j;
	for(i=0;i<x;i++)
		for(j=0;j<200;j++);
}			

// ---------------------------------

int main(void)
{
	InitSystem();
	OSTaskCreate(AppStart, (void *)0, AppStartStk, 4);
	P1=0xfe;
	Delay();
	P1=0x7f;
	Delay();
	OSStart();
	return OK;
}

/*
********************************************************************************************************* 
*                                             系统开始任务
*
* 描述       : 开定时器T0中断,创建消息邮箱以及所有其他的任务,然后自我删除。
*
* 参数       : ppdata
*
* 注意       : 系统启动后第一时间开定时器中断,否则系统其它任务无法得到执行。		                        	
*********************************************************************************************************
*/
void AppStart(void *ppdata) REENTRANT
{
	ppdata=ppdata;
	ET0=1; /* 谨记:系统启动后第一时间开定时器中断 */

//	LogoDisp();
//	PrintStr("You can input by the terminal!\n\n\n");

	
	OSTaskCreate(P1Up, (void *)0, P1UpStk, 5);
	OSTaskCreate(P1Down, (void *)0, P1DownStk, 6);
	 	
	OSTaskDel(OS_PRIO_SELF);
		
}

/*
********************************************************************************************************* 
*                                             工作状态指示任务
*
* 描述       : CPU正常工作时,每秒钟闪烁5次,不工作时不闪烁,控制端口P3.4。
*
* 参数       : ppdata
*
* 注意       : 一个时钟节拍为0.02s,建议优先级设为最低,高于系统空闲任务和系统统计任务。强烈引起您的重视:
*			   ..\ucos_51\ucos-ii\src\ucos_ii.h	
*			   		OS_EXT  DF_IDATA  volatile  INT32U  OSIdleCtr; 
*			   "OSIdleCtr" 变量务必设置为 "idata" 存储类型,否则任务运行节拍变慢。		                        	
*********************************************************************************************************
*/
void P1Up(void *ppdata) REENTRANT
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif

	ppdata=ppdata;
	
		while(1)
	{

		OS_ENTER_CRITICAL();
		P1=0xfe;
		Delay();
		P1=0x7f;
		Delay();
		OS_EXIT_CRITICAL();
		OSTimeDly(20);
	}

/*	for(;;)
	{
		OS_ENTER_CRITICAL();

		 P1=0xfe;
		OS_EXIT_CRITICAL();
		DelayMS(4);

//		OSTimeDlyHMSM(0,0,0,400);
//		OSTimeDly(10);	 

	} */
}

void P1Down(void *ppdata) REENTRANT
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif

	ppdata=ppdata;

		while(1)
	{

		OS_ENTER_CRITICAL();
		P1=253;
		Delay();
		P1=191;
		Delay();
		OS_EXIT_CRITICAL();
		OSTimeDly(50);
	}
	
/*	for(;;)
	{
		OS_ENTER_CRITICAL();

		 P1=0x7f;
		DelayMS(4);

		OS_EXIT_CRITICAL();

//		OSTimeDlyHMSM(0,0,0,200);
		OSTimeDly(200);
	} */
}

/*
********************************************************************************************************* 
*                                             串口收发任务
*
* 描述       : UartRcv任务负责从键盘接收,通过消息邮箱发送给UartSend任务处理并在终端打印。
*
* 参数       : ppdata
*
* 注意       : 多任务的并发执行,须妥善处理对临界资源的访问以及多任务之间的通信。	                        	
*********************************************************************************************************
*/
// ------------------------------------------------------------------------------------------------------
/*void UartRcv(void *ppdata) REENTRANT
{
	static INT8U RxBuf;
	static INT8U err;

	ppdata=ppdata;
		
	for(;;)
	{
		if(Getch(&RxBuf)) 
		{
			OSMboxPost(UartMbox, (void *)&RxBuf);
			OSMboxPend(AckMbox, 0, &err);
		}	
		
		OSTimeDlyHMSM(0,0,0,100);
	}	
}

void UartSend(void *ppdata) REENTRANT
{
	static INT8U *TxBuf;
	static INT8U err;
	INT16U count=0;	

	ppdata=ppdata;

	for(;;)
	{
		TxBuf=(INT8U *)OSMboxPend(UartMbox,0,&err);

		if(OS_NO_ERR==err)
		{	
			PrintChar(*TxBuf);

			count++;
			
			if((*TxBuf == ENTER) || (count == 0xFFFF)) count=1; 
		
			if(!(count%69))
			{ 
				PrintStr("\n");
			}	
		}
		else 
		{
			PrintStr("\n\nMboxRcv err!\n\n\n");
		}

		OSMboxPost(AckMbox,(void *)ACK);
	}
} */
// ------------------------------------------------------------------------------------------------------

⌨️ 快捷键说明

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