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

📄 main.c

📁 UCOS在VC++开发环境上运行的测试程序
💻 C
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
* description	:	移植uC/OS-II(2.51 Kernal)在Visual C++ Complier运行。
* date			:	2006.10.19
* change by		:	HCF 
*********************************************************************************************************
* 版本历史	
* 10_19			:	1.0版本
---------------------------------------------------------------------------------------------------------
* 目前发现的问题:	
*					任务堆栈只能设置成2048(OS_STK)大小
---------------------------------------------------------------------------------------------------------
*/

#include "includes.h"

/*
*********************************************************************************************************
*                                               CONSTANTS
*********************************************************************************************************
*/

#define  TASK_STK_SIZE   2048					//任务堆栈长度,只能设置为2048!!!!!

/*
*********************************************************************************************************
*		 必须定义以下任务堆栈空间使用,作为创建优先级别为0的TaskStart()任务的任务堆栈
*********************************************************************************************************
*/
OS_STK	 TASKSTARTSTK[TASK_STK_SIZE];			//TaskStart的任务堆栈空间			

OS_STK   MyTaskStk[TASK_STK_SIZE];				//定义任务堆栈区
OS_STK   YouTaskStk[TASK_STK_SIZE];				//定义任务堆栈区
INT16S   key;									//用于退出uCOS_II的键	
INT8U	 x=0,y=0;								//字符显示位置

HANDLE mainhandle;								// 主线程句柄
CONTEXT Context;								// 主线程切换上下文
BOOLEAN FlagEn = 1;								// 增加一个全局变量,做为是否时钟调度的标志


/*
*********************************************************************************************************
*                                           FUNCTION PROTOTYPES
*********************************************************************************************************
*/

void	VCInit(void);							// 初始化相关变量,一定需要
void	TaskStart( void * pParam );				
void	MyTask(void *data);						//声明任务
void	YouTask(void *data);					//声明任务


/*
*********************************************************************************************************
*	函 数 名:	main(int argc, char **argv)
*	函数功能:
*	入口参数:
*	返回参数:
*********************************************************************************************************
*/
void main(int argc, char **argv)
{
	char* s_M="M";									//定义要显示的字符

	VCInit();								        //初始化一些变量,编译器相关

    OSInit();										//初始化uCOS_II

/*
********************************************************************************************************
*	以下两行代码不需要使用,下面两行代码仅为Borland C编译器为使用DOS界面而必需的
--------------------------------------------------------------------------------------------------------
    PC_DOSSaveReturn();								//保存Dos环境
    PC_VectSet(uCOS, OSCtxSw);						//安装uCOS_II中断
********************************************************************************************************
*/
	
/*
*******************************************************************************************************/
//
//	必须创建以下这个任务,作为设置uCOS_II时钟频率使用,与MyTask()中的这两行代码等效
//
////////////////////////////////////////////////////////////////////////////////////////////////////////
	OSTaskCreate(TaskStart,0, &TASKSTARTSTK[TASK_STK_SIZE - 1], 0 );			// 必须使用
////////////////////////////////////////////////////////////////////////////////////////////////////////    
	OSTaskCreate(MyTask,							//创建任务MyTask
		s_M,										//给任务传递参数
		&MyTaskStk[TASK_STK_SIZE - 1],				//设置任务堆栈栈顶指针
		1);											//使任务MyTask的优先级别为1

    OSStart();										//启动uCOS_II的多任务管理
}

/*
*********************************************************************************************************
*	函 数 名:	VCInit()
*	函数功能:	编译器初始化,VC环境下一定需要
*	入口参数:	无
*	返回参数:	无
*********************************************************************************************************
*/
void VCInit(void)
{
	HANDLE cp,ct;
	Context.ContextFlags = CONTEXT_CONTROL;
	cp = GetCurrentProcess();								//得到当前进程句柄
	ct = GetCurrentThread();								//得到当前线程伪句柄
	DuplicateHandle(cp, ct, cp, &mainhandle, 0, TRUE, 2);	//伪句柄转换,得到线程真句柄
}

/*
*********************************************************************************************************
*	函 数 名:	Task_start( )
*	函数功能:	启动统计任务(只创建,不做参与任务调度),该任务创建,作为设置uCOS_II时钟频率使用,
*				与MyTask()中的这两行代码等效:
*				PC_VectSet(0x08, OSTickISR);			//安装uCOS_II时钟中断向量
*				PC_SetTickRate(OS_TICKS_PER_SEC);		//设置uCOS_II时钟频率
*	入口参数:	
*	返回参数:	无
*********************************************************************************************************
*/

void TaskStart( void * pParam ) 
{	
	char err;	
	OS_EVENT *sem1;

	timeSetEvent(1000/OS_TICKS_PER_SEC, 0, OSTickISR, 0, TIME_PERIODIC);	//开启一个定时器线程,感觉10 ticks/s比较好
	OSStatInit();
	sem1 = OSSemCreate(0);
	while(1)
	{		
		//sleep ,wait for sem1,run other task
		OSSemPend(sem1, 0, &err);   
	}
}


/***********************任务MyTask*******************************************/

void  MyTask (void *pdata)
{
    char* s_Y="Y";				//定义要显示的字符

#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif

    pdata = pdata; 

    OS_ENTER_CRITICAL();

/******************  以下两行代码不需要 ************************************/
//    PC_VectSet(0x08, OSTickISR);			//安装uCOS_II时钟中断向量
//    PC_SetTickRate(OS_TICKS_PER_SEC);		//设置uCOS_II时钟频率
    
	OS_EXIT_CRITICAL();

    OSStatInit();							//初始化uCOS_II的统计任务
    OSTaskCreate(YouTask,					//创建任务MyTask
		s_Y,								//给任务传递参数
		&YouTaskStk[TASK_STK_SIZE - 1],		//设置任务堆栈栈顶指针
		2);									//使任务MyTask的优先级别为0
    for (;;) 
    {        
        if (x>50) 
		{
			x=0;
			y+=2;							
        }
                                                 
        PC_DispChar(x, y,					//显示字符的位置
		*(char*)pdata, 
		DISP_BGND_BLACK+DISP_FGND_WHITE );
       	x += 1;                         

/*
*******************************************************************************************
*		以下此类代码在VC环境中不需要如此处理,可以直接去掉
		//如果按下Esc键则退出uCOS_II
		if (PC_GetKey(&key) == TRUE) 
		{
			if (key == 0x1B) 
			{
				PC_DOSReturn();
			}
		}
*****************************************************************************************/
		OSTimeDlyHMSM(0, 0, 3, 0);			//等待
    }
}
/************************任务YouTask*****************************************/
void  YouTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif

    pdata = pdata; 

    
	for (;;) 
    {        
        if (x>50) 
		{
		   x=0;
		   y+=2; 
		}
                                                 
        PC_DispChar(x, y,				//显示字符的位置
		*(char*)pdata, 
		DISP_BGND_BLACK+DISP_FGND_WHITE );
       	x += 1;	
			
        OSTimeDlyHMSM(0, 0, 1, 0);		//等待
    }
}
/************************End*************************************************/

⌨️ 快捷键说明

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