www.pudn.com > ucos_vc0.1.rar > TEST.C


/* 
********************************************************************************************************* 
*                                                uC/OS-II 
*                                          The Real-Time Kernel 
* 
description:后	一共有4个线程,主线程TaskStart初始化消息队列,开启定时器,Tast1只是简单的运行 
				Task2给Task3发消息,收到回执继续发,从A发到Z,task3则收取消息并回执 
 
author:		文佳 Email:ganganwen@163.com 
********************************************************************************************************* 
*/ 
 
#include "includes.h" 
 
/* 
********************************************************************************************************* 
*                                               CONSTANTS 
********************************************************************************************************* 
*/ 
 
#define  TASK_STK_SIZE                 1024       /* Size of each task's stacks (# of WORDs)            */ 
#define  N_TASKS                        10       /* Number of identical tasks                          */ 
 
#define TaskStart_Prio	1 
#define Task1_Prio		2 
#define Task2_Prio		3 
#define Task3_Prio		4 
 
#define TaskStart_ID	0 
#define Task1_ID		1 
#define Task2_ID		2 
#define Task3_ID		3 
/* 
********************************************************************************************************* 
*                                               VARIABLES 
********************************************************************************************************* 
*/ 
 
OS_STK  TaskStk[N_TASKS][TASK_STK_SIZE];    // Tasks stacks 
 
OS_EVENT *AckMbox; 
OS_EVENT *TxMbox; 
 
BOOLEAN FlagEn = 0;		//增加一个全局变量,做为是否时钟调度的标志 
 
int m,n; 
 
/* 
********************************************************************************************************* 
*                                           FUNCTION PROTOTYPES 
********************************************************************************************************* 
*/ 
void TaskStart(void * pParam) ; 
void Task1(void * pParam) ;                            /* Function prototypes of tasks                  */ 
void Task2(void * pParam) ;                      /* Function prototypes of Startup task           */ 
void Task3(void * pParam) ; 
void VCInit(void);						//初始化相关变量 
 
 
 
/*$PAGE*/ 
/* 
********************************************************************************************************* 
*                                                MAIN 
********************************************************************************************************* 
*/ 
 
int main(int argc, char **argv) 
{ 
	VCInit();	//初始化一些变量 
	 
	OSInit(); 
	OSTaskCreateExt(TaskStart, 0, &TaskStk[0][TASK_STK_SIZE-1], TaskStart_Prio, TaskStart_ID, &TaskStk[0][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK ); 
	OSTaskCreateExt(Task1, 0, &TaskStk[1][TASK_STK_SIZE-1], Task1_Prio, Task1_ID, &TaskStk[1][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK ); 
	OSTaskCreateExt(Task2, 0, &TaskStk[2][TASK_STK_SIZE-1], Task2_Prio, Task1_ID, &TaskStk[2][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK ); 
	OSTaskCreateExt(Task3, 0, &TaskStk[3][TASK_STK_SIZE-1], Task3_Prio, Task1_ID, &TaskStk[3][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK ); 
	OSStart();	//start never return 
	 
	return 0; 
} 
 
void VCInit(void) 
{ 
	HANDLE cp,ct; 
	Context.ContextFlags = CONTEXT_CONTROL; 
	cp = GetCurrentProcess();	//得到当前进程句柄 
	ct = GetCurrentThread();	//得到当前线程伪句柄 
	DuplicateHandle(cp, ct, cp, &mainhandle, 0, TRUE, 2);	//伪句柄转换,得到线程真句柄 
		 
} 
 
void TaskStart(void * pParam)  
{	 
	AckMbox = OSMboxCreate(0); 
	TxMbox = OSMboxCreate(0); 
 
	OS_ENTER_CRITICAL();	//调用printf函数最后关中断 
	printf( "main Start running\n"); 
	OS_EXIT_CRITICAL(); 
	timeSetEvent(1000/OS_TICKS_PER_SEC, 0, OSTickISR, 0, TIME_PERIODIC);	//开启一个定时器线程,感觉10 ticks/s比较好 
	 
 
	OS_ENTER_CRITICAL();	//调用printf函数最后关中断 
	printf( "main Start delete \n"); 
	OS_EXIT_CRITICAL(); 
     
	OSTaskDel (TaskStart_Prio); 
//	OSTaskChangePrio(TaskStart_Prio,5); 
//	while(1) 
//	{ 
		 
//		OtxSCSwCtr = 0; 
//		OSTimeDly(OS_TICKS_PER_SEC); 
//	} 
} 
 
void Task1(void * pParam) 
{ 
	 
	 
	while(1)	 
	{ 
		OS_ENTER_CRITICAL();	 
		printf("task1 running\n"); 
		OS_EXIT_CRITICAL(); 
 
		OSTaskChangePrio(Task1_Prio,5); 
		OSTimeDly(2); 
	} 
	 
} 
 
void Task2(void * pParam) 
{	//往接收消息队列发送从A到Z 
	char txmsg; 
	char * ackn; 
	INT8U err; 
	 
	txmsg = 'A'; 
	while(1)	 
	{ 
	    OS_ENTER_CRITICAL();	 
	    printf("task2 send char %c\n", txmsg); 
	    OS_EXIT_CRITICAL(); 
		OSMboxPost(TxMbox, &txmsg); 
		ackn=OSMboxPend(AckMbox, 0, &err); 
		txmsg++; 
		if(txmsg == 'Z') 
			txmsg = 'A'; 
	   
		OSTimeDly(15); 
	} 
} 
 
void Task3(void * pParam) 
{ 
	char *rxmsg; 
	char  ok; 
	INT8U err; 
	ok= 'O'; 
	while(1)	 
	{ 
		rxmsg = OSMboxPend(TxMbox,  0, &err); 
 
		OS_ENTER_CRITICAL();	 
		printf( "task3 receive char %c\n", *rxmsg); 
		OS_EXIT_CRITICAL(); 
 
		 
		OSTimeDly(15); 
//      OSMboxPost(AckMbox, (void*)1); 
		OSMboxPost (AckMbox,&ok); 
	} 
	 
}