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

📄 test.c

📁 建立两个任务AB
💻 C
字号:
/*
*********************************************************************************************************
*                          uC/OS-II 第一次试验成果
*                建立两个任务A,B,并可以被挂起和恢复,并显示被挂起任务的信息
*                               2009-3-24
*                              B06513班9号
*                                邵玉广
*********************************************************************************************************
*/

#include "includes.h"

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

#define  TASK_STK_SIZE                 512       /* Size of each task's stacks (# of WORDs)            */
#define  N_TASKS                        10       /* Number of identical tasks                          */
/*
*********************************************************************************************************
*                                               VARIABLES
*********************************************************************************************************
*/
OS_STK           MyTaskStkA[TASK_STK_SIZE];  //定义自己的任务堆栈
OS_STK           MyTaskStkB[TASK_STK_SIZE];  //定义自己的任务堆栈
INT16S           key;  //设置推出键
INT8U            x=0,y=2;
/*
*********************************************************************************************************
*                                           FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void   MyTaskA(void *data);//定义自己的任务
void   MyTaskB(void *data);//定义自己的任务
/*$PAGE*/
/*
*********************************************************************************************************
*                                                MAIN
*********************************************************************************************************
*/
char *s_MA="I am TaskA!";            //定义要输出的字符
char *s_MB="I am TaskB!";            //定义要输出的字符
void main (void)
{
	 PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);      /* Clear the screen                         */
	 OSInit();                                              /* Initialize uC/OS-II                      */
	 PC_DOSSaveReturn();                                    /* Save environment to return to DOS        */
	 PC_VectSet(uCOS, OSCtxSw);                             /* Install uC/OS-II's context switch vector */
	 PC_DispStr(26,  0, "uC/OS-II", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
	 OSTaskCreate(MyTaskA,s_MA,&MyTaskStkA[TASK_STK_SIZE-1], 0);
	 OSTaskCreate(MyTaskB,s_MB,&MyTaskStkB[TASK_STK_SIZE-1], 1);
	 OSStart();                                             /* Start multitasking                       */
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                              STARTUP TASK
*********************************************************************************************************
*/
/********************************************************************************************************
										定义自己的任务
*******************************************************************************************************/
void MyTaskA(void *pdata)
{     OS_TCB aa;
		char *s,*a;
	  #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
	  OS_CPU_SR  cpu_sr;
	  #endif
	  pdata=pdata;
	  OS_ENTER_CRITICAL();
	  PC_VectSet(0x08, OSTickISR);                           /* Install uC/OS-II's clock tick ISR        */
	  PC_SetTickRate(OS_TICKS_PER_SEC);                    /* Reprogram tick rate                      */
	  OS_EXIT_CRITICAL();
	  OSStatInit();                                          /* Initialize uC/OS-II's statistics         */
	  for(;;)
	  {
			 if(x>10)
			 {
					x=0;
					y+=2;
			 }
			 PC_DispStr(x,y,pdata,DISP_BGND_BLACK+DISP_FGND_RED); //为什么第一个 参数不能是 WHITE
			 x+=11;
			 if(PC_GetKey(&key)==TRUE)
			 {
				  if(key==0x1B)
				  {
						 OSTaskSuspend(1);//挂起任务B
						 PC_DispStr(30,  8, "Task B is suspended!", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
						 OSTaskQuery(1,&aa);
						 sprintf(s,"%d",aa.OSTCBPrio);                    /* Display CPU usage in %*/
						 PC_DispStr(30,  10,"Task B's prio:", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
						 PC_DispStr(45,  10, s, DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
				  }
				  else
				  {
						 OSTaskResume(1);
						 PC_DispStr(30,  12, "Task B is live!", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
						 OSTimeDlyHMSM(0,0,5,0);              //等待5秒
						 PC_DOSReturn();      //返回dos
				  }
			 }
			 OSTimeDlyHMSM(0,0,1,0);              //等待1秒
	  }
}

/********************************************************************************************************
										定义自己的任务
*******************************************************************************************************/
void MyTaskB(void *pdata)
{
	  #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
	  OS_CPU_SR  cpu_sr;
	  #endif
	  pdata=pdata;
	  OS_ENTER_CRITICAL();
	  PC_VectSet(0x08, OSTickISR);                           /* Install uC/OS-II's clock tick ISR        */
	  PC_SetTickRate(OS_TICKS_PER_SEC);                      /* Reprogram tick rate                      */
	  OS_EXIT_CRITICAL();
	  OSStatInit();
	  x=15;												  /* Initialize uC/OS-II's statistics         */
	  for(;;)
	  {

			 if(x>10)
			 {
					x=15;
			 }
			 PC_DispStr(x,y,pdata,DISP_BGND_BLACK+DISP_FGND_RED); //为什么第一个 参数不能是 WHITE

			 x+=11;
			 if(PC_GetKey(&key)==TRUE)
			 {
				  if(key==0x0B)
				  {
						  PC_DOSReturn();                     //返回dos
				  }
			 }
			 OSTimeDlyHMSM(0,0,1,0);              //等待1秒
	  }
}

⌨️ 快捷键说明

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