www.pudn.com > ucos-ii.rar > TEST.C


 
 
/* 
********************************************************************************************************* 
*                                                uC/OS-II 
*                                          The Real-Time Kernel 
* 
*                          (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL 
*                                           All Rights Reserved 
* 
*                                   Crossroads Traffic Control System 
*                          UC_OS-II大综合作业(南昌大学软件学院)嵌入式——龙波 
********************************************************************************************************* 
*/ 
 
#include "includes.h" 
//#include "string.h" 
//#include "stdlib.h" 
#include "time.h" 
/* 
********************************************************************************************************* 
*                                              CONSTANTS 
********************************************************************************************************* 
*/ 
 
#define          TASK_STK_SIZE     512                /* Size of each task's stacks (# of WORDs)       */ 
 
 
#define          TASK_START_ID       0                /* Application tasks IDs                         */ 
#define          TASK_CLK_ID         1 
#define          TASK_1_ID           2 
#define          TASK_2_ID           3 
#define          TASK_3_ID           4 
#define          TASK_4_ID           5 
#define          TASK_5_ID           6 
#define          TASK_6_ID           7 
 
 
#define          TASK_START_PRIO    10                /* Application tasks priorities                  */ 
#define          TASK_CLK_PRIO      11 
#define          TASK_1_PRIO        12 
#define          TASK_2_PRIO        13 
#define          TASK_3_PRIO        14 
#define          TASK_4_PRIO        15 
#define          TASK_5_PRIO        16 
#define          TASK_6_PRIO        17 
 
INT16S   key;                                         /*用于退出uCOS_II的键                            */	 
 
BOOLEAN   ac_key;                                     /*设置信号量初值                                 */ 
BOOLEAN   c; 
BOOLEAN   d; 
INT8U     err; 
INT8U     i;                                          /*用于显示转弯闪烁次数参数                       */	 
INT8U     m = 100;                                    /*用户检测器统计各方向车流量                     */ 
INT8U     n = 100; 
INT8U     x = 100; 
INT8U     y = 100; 
INT8U     id=  10;                                    /*设置智能控制通行时间变化量                     */ 
INT8U     p1;                                         /*检测各方向车流量倍数关系                       */ 
INT8U     p2; 
INT8U      p; 
OS_EVENT *Str_Box; 
//OS_EVENT     *RandomSem; 
char *s; 
char *ss; 
char *West_wait; 
char *East_wait; 
char *South_wait; 
char *North_wait; 
 
static void  TaskStartDispInit(void); 
 
 
/* 
********************************************************************************************************* 
*                                              VARIABLES 
********************************************************************************************************* 
*/ 
 
OS_STK        TaskStartStk[TASK_STK_SIZE];            /* Startup    task stack                         */ 
OS_STK        TaskClkStk[TASK_STK_SIZE];              /* Clock      task stack                         */ 
OS_STK        Task1Stk[TASK_STK_SIZE];                /* Task #1    task stack                         */ 
OS_STK        Task2Stk[TASK_STK_SIZE];                /* Task #2    task stack                         */ 
OS_STK        Task3Stk[TASK_STK_SIZE];                /* Task #3    task stack                         */ 
OS_STK        Task4Stk[TASK_STK_SIZE];                /* Task #4    task stack                         */ 
OS_STK        Task5Stk[TASK_STK_SIZE];                /* Task #5    task stack                         */ 
OS_STK        Task6Stk[TASK_STK_SIZE];                /* Task #6    task stack                         */ 
 
 
/* 
********************************************************************************************************* 
*                                         FUNCTION PROTOTYPES 
********************************************************************************************************* 
*/ 
 
        void  TaskStart(void *data);                  /* Function prototypes of tasks                  */ 
static  void  TaskStartCreateTasks(void); 
static  void  TaskStartDispInit(void); 
static  void  TaskStartDisp(void); 
        void  TaskClk(void *data); 
        void  Task1(void *data); 
        void  Task2(void *data); 
        void  Task3(void *data); 
        void  Task4(void *data); 
        void  Task5(void *data); 
		void  Task6(void *data); 
 
/*$PAGE*/ 
/* 
********************************************************************************************************* 
*                                                  MAIN 
********************************************************************************************************* 
*/ 
 
void  main (void) 
{ 
	OS_STK *ptos; 
    OS_STK *pbos; 
    INT32U  size; 
 
    PC_DispClrScr(DISP_BGND_BLACK);                        /* Clear the screen                         */ 
 
    OSInit();                                              /* Initialize uC/OS-II                      */ 
	 
	ac_key=TRUE; 
	d=TRUE; 
	c=TRUE; 
 
    PC_DOSSaveReturn();                                    /* Save environment to return to DOS        */ 
 
    PC_VectSet(uCOS, OSCtxSw);                             /* Install uC/OS-II's context switch vector */ 
	Str_Box=OSMboxCreate((void*)0); 
 
    PC_ElapsedInit();                                      /* Initialized elapsed time measurement     */ 
 
    ptos        = &TaskStartStk[TASK_STK_SIZE - 1];        /* TaskStart() will use Floating-Point      */ 
    pbos        = &TaskStartStk[0]; 
    size        = TASK_STK_SIZE; 
    OSTaskStkInit_FPE_x86(&ptos, &pbos, &size);    
//    RandomSem   = OSSemCreate(1);                        /* Random number semaphore                  */ 
    OSTaskCreateExt(TaskStart, 
                   (void *)0, 
                   ptos, 
                   TASK_START_PRIO, 
                   TASK_START_ID, 
                   pbos, 
                   size, 
                   (void *)0, 
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 
					 
 
    OSStart();                                             /* Start multitasking                       */ 
} 
 
/*$PAGE*/ 
/* 
********************************************************************************************************* 
*                                               STARTUP TASK 
********************************************************************************************************* 
*/ 
 
void  TaskStart (void *pdata) 
{ 
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */ 
    OS_CPU_SR  cpu_sr; 
#endif 
    INT16S     key; 
 
 
    pdata = pdata;                                         /* Prevent compiler warning                 */ 
 
    TaskStartDispInit();                                   /* Setup the display                        */ 
 
    OS_ENTER_CRITICAL();                                   /* Install uC/OS-II's clock tick ISR        */ 
    PC_VectSet(0x08, OSTickISR); 
    PC_SetTickRate(OS_TICKS_PER_SEC);                      /* Reprogram tick rate                      */ 
    OS_EXIT_CRITICAL(); 
 
    OSStatInit();                                          /* Initialize uC/OS-II's statistics         */ 
 
    TaskStartCreateTasks(); 
                                                            /*这是一个永真循环。所有uC/OS-II程序都包含一 
															个永真循环,这样做能防止出现程序跑飞的现象 */ 
     for (;;) { 
        TaskStartDisp();                                   /* Update the display                       */ 
 
        if (PC_GetKey(&key)) {                             /* See if key has been pressed              */ 
            if (key == 0x1B) {                             /* Yes, see if it's the ESCAPE key          */ 
                PC_DOSReturn();                            /* Yes, return to DOS                       */ 
            } 
        } 
 
        OSCtxSwCtr = 0;                                    /* Clear the context switch counter         */ 
        OSTimeDly(OS_TICKS_PER_SEC);                       /* Wait one second                          */ 
    } 
} 
 
/*$PAGE*/ 
/* 
********************************************************************************************************* 
*                                      CREATE APPLICATION TASKS 
********************************************************************************************************* 
*/ 
 
static  void  TaskStartCreateTasks (void) 
{ 
    OSTaskCreateExt(TaskClk, 
                   (void *)0, 
                   &TaskClkStk[TASK_STK_SIZE - 1], 
                   TASK_CLK_PRIO, 
                   TASK_CLK_ID, 
                   &TaskClkStk[0], 
                   TASK_STK_SIZE, 
                   (void *)0, 
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 
 
    OSTaskCreateExt(Task1, 
                   (void *)0, 
                   &Task1Stk[TASK_STK_SIZE - 1], 
                   TASK_1_PRIO, 
                   TASK_1_ID, 
                   &Task1Stk[0], 
                   TASK_STK_SIZE, 
                   (void *)0, 
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 
 
    OSTaskCreateExt(Task2, 
                   (void *)0, 
                   &Task2Stk[TASK_STK_SIZE - 1], 
                   TASK_2_PRIO, 
                   TASK_2_ID, 
                   &Task2Stk[0], 
                   TASK_STK_SIZE, 
                   (void *)0, 
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 
 
    OSTaskCreateExt(Task3, 
                   (void *)0, 
                   &Task3Stk[TASK_STK_SIZE - 1], 
                   TASK_3_PRIO, 
                   TASK_3_ID, 
                   &Task3Stk[0], 
                   TASK_STK_SIZE, 
                   (void *)0, 
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 
 
    OSTaskCreateExt(Task4, 
                   (void *)0, 
                   &Task4Stk[TASK_STK_SIZE-1], 
                   TASK_4_PRIO, 
                   TASK_4_ID, 
                   &Task4Stk[0], 
                   TASK_STK_SIZE, 
                   (void *)0, 
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 
 
    OSTaskCreateExt(Task5, 
                   (void *)0, 
                   &Task5Stk[TASK_STK_SIZE-1], 
                   TASK_5_PRIO, 
                   TASK_5_ID, 
                   &Task5Stk[0], 
                   TASK_STK_SIZE, 
                   (void *)0, 
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 
	    OSTaskCreateExt(Task6, 
                   (void *)0, 
                   &Task6Stk[TASK_STK_SIZE-1], 
                   TASK_6_PRIO, 
                   TASK_6_ID, 
                   &Task6Stk[0], 
                   TASK_STK_SIZE, 
                   (void *)0, 
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 
} 
 
/*$PAGE*/ 
/* 
********************************************************************************************************* 
*                                        INITIALIZE THE DISPLAY 
********************************************************************************************************* 
*/ 
 
static  void  TaskStartDispInit (void) 
{ 
/*                                1111111111222222222233333333334444444444555555555566666666667777777777 */ 
/*                      01234567890123456789012345678901234567890123456789012345678901234567890123456789 */ 
    PC_DispStr( 0,  0, "                         uC/OS-II, The Real-Time Kernel                         ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK); 
    PC_DispStr( 0,  1, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  2, "                        Crossroads Traffic Control System                       ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  3, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
	PC_DispStr( 0,  4, "|-----------------------------------|      |-----------------------------------|", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  5, "               See in West                            See in East               ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  6, "|-----------------------------------|      |-----------------------------------|", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  7, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  8, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  9, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 10, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 11, "|-----------------------------------|      |-----------------------------------|", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 12, "               See in North                            See in South             ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 13, "|-----------------------------------|      |-----------------------------------|", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 14, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 15, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 16, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 17, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 18, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 19, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 20, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 21, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 22, "#Tasks          :        CPU Usage:     %                                       ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 23, "#Task switch/sec:                                                               ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 24, "                            <-PRESS 'ESC' TO QUIT->                             ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK); 
/*                                1111111111222222222233333333334444444444555555555566666666667777777777 */ 
/*                      01234567890123456789012345678901234567890123456789012345678901234567890123456789 */ 
} 
 
/*$PAGE*/ 
/* 
********************************************************************************************************* 
*                                               TASK #1 
* 
* Description: 第2、8行绿色字符显示事务、第6行橙色字符显示事务。南北向的检测器完成的事务可放在同一个任务中。 
*               
*               
********************************************************************************************************* 
*/ 
 
void  Task1 (void *pdata) 
{ 
#if OS_CRITICAL_METHOD == 3 
    OS_CPU_SR  cpu_sr; 
#endif 
    char   t[10]; 
    pdata = pdata; 
 
 
    for (;;) { 
		if(ac_key)                                                                                       /*第一次执行挂起后续任务             */ 
		{ 
		   ac_key=FALSE; 
		   OSTaskSuspend(13); 
		   OSTaskSuspend(14); 
		   OSTaskSuspend(15); 
		   OSTaskSuspend(16); 
 
		} 
		PC_DispStr(  2,  7,"Please slow moving -------> East ", DISP_FGND_GREEN + DISP_BGND_LIGHT_GRAY); /*请减速通过路口向东(或者西)行      */ 
        PC_DispStr( 46,  7,"Please slow moving -------> West ", DISP_FGND_GREEN + DISP_BGND_LIGHT_GRAY); 
		PC_DispStr(  2, 16,"Car [-->South] must park to wait ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY);   /*请南(或者北)行汔车停车等候        */ 
        PC_DispStr( 46, 16,"Car [-->North] must park to wait ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY); 
               
		PC_DispStr(  2, 8,"                                  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY);/*将其他显示信息清空,刷新            */ 
        PC_DispStr( 46, 8,"                                  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
        PC_DispStr(  2, 9,"                                  ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY); 
        PC_DispStr( 46, 9,"                                  ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY); 
	    PC_DispStr(  2,14,"                                  ", DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
		PC_DispStr( 46,14,"                                  ", DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
        PC_DispStr(  2,15,"                                  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
        PC_DispStr( 46,15,"                                  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
 
		OSTimeDlyHMSM(0,0,10,0);                                                                         /*东西正向通行距1分钟差10秒           */ 
		OSTaskResume(16);                                                                                /*唤醒Task5                           */ 
        OSTimeDlyHMSM(0,0,1,0); 
	    sprintf(t, "%5d", id);                                                                           /* Display #id                        */ 
        PC_DispStr(2, 18, t, DISP_FGND_YELLOW + DISP_BGND_BLUE); 
		OSTimeDlyHMSM(0, 0, id, 0);                                                                      /*智能控制通行时间变化                */ 
		s="slow move --> East/West will end";                                                         
        OSMboxPost(Str_Box,s);                                                                           /*以消息邮箱发送东西向即将结束通行信号*/ 
        OSTimeDlyHMSM(0,0,5,0);                                                                          /*东西正向通行最后10秒                */ 
		OSTaskResume(14);                                                                                /*唤醒Task3                           */ 
		OSTaskSuspend(OS_PRIO_SELF); 
    } 
} 
 
/*$PAGE*/ 
/* 
********************************************************************************************************* 
*                                               TASK #2 
* 
* Description: 第4、6行绿色字符显示事务、第2行橙色字符显示事务。东西向的检测器完成的事务可放在同一个任务中。 
* 
* 
********************************************************************************************************* 
*/ 
 
void  Task2 (void *pdata) 
{ 
#if OS_CRITICAL_METHOD == 3 
    OS_CPU_SR  cpu_sr; 
#endif 
    char   t[10];     
    pdata = pdata; 
     
	for (;;) 
    { 
		PC_DispStr( 2,  9,"Car [--> East] must park to wait  ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY);   /*请东(或者西)行汔车停车等候        */ 
        PC_DispStr( 46, 9,"Car [--> West] must park to wait  ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY);    
		PC_DispStr( 2, 14,"Please slow moving ------->North  ", DISP_FGND_GREEN + DISP_BGND_LIGHT_GRAY); /*请减速通过路口向南(或者北)行      */ 
        PC_DispStr( 46,14,"Please slow moving ------->South  ", DISP_FGND_GREEN+ DISP_BGND_LIGHT_GRAY); 
		                   
		PC_DispStr(  2, 7,"                                  ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY);   /*将其他显示信息清空,刷新            */ 
        PC_DispStr( 46, 7,"                                  ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY); 
	    PC_DispStr(  2, 8,"                                  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
        PC_DispStr( 46, 8,"                                  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
        PC_DispStr(  2,15,"                                  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
        PC_DispStr( 46,15,"                                  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
        PC_DispStr(  2,16,"                                  ", DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
	    PC_DispStr( 46,16,"                                  ", DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
 
 
        OSTimeDlyHMSM(0,0,10,0);                                                                         /*南北正向通行距1分钟差10秒           */ 
	    OSTaskResume(16);                                                                                /*唤醒Task5                           */ 
        OSTimeDlyHMSM(0,0,1,0); 
	    sprintf(t, "%5d", id);                                                                           /* Display #id                        */ 
        PC_DispStr(46, 18, t, DISP_FGND_YELLOW + DISP_BGND_BLUE);		  
		OSTimeDlyHMSM(0, 0, id, 0);                                                                      /*智能控制通行时间变化                */ 
	    s="slow move -->South/North will end";                                                           /*以消息邮箱发送南北向即将结束通行信号*/ 
        OSMboxPost(Str_Box,s); 
		OSTimeDlyHMSM(0,0,5,0);                                                                          /*南北正向通行最后10秒                */ 
	    OSTaskResume(15);                                                                                /*唤醒Task4                           */  
	    OSTaskSuspend(OS_PRIO_SELF); 
    } 
} 
 
/*$PAGE*/ 
/* 
********************************************************************************************************* 
*                                               TASK #3 
* 
* Description: 东西方向,用黄色的显示“请减速通过路口左拐”,同时闪烁50秒结束。 
* 
*  
********************************************************************************************************* 
*/ 
 
void  Task3 (void *pdata) 
{ 
#if OS_CRITICAL_METHOD == 3 
    OS_CPU_SR  cpu_sr; 
#endif 
     
    pdata = pdata; 
    for (;;) 
    { 
	    PC_DispStr(  2, 7,"                                  ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY); 
        PC_DispStr( 46, 7,"                                  ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY); 
		PC_DispStr(  2, 9,"                                  ", DISP_FGND_GREEN + DISP_BGND_LIGHT_GRAY); 
        PC_DispStr( 46, 9,"                                  ", DISP_FGND_GREEN + DISP_BGND_LIGHT_GRAY); 
 
	    for(i=1;i<5;i++)                                                                                     /*显示“请减速通过路口左拐”,同时闪烁50秒结束*/ 
		{ 
	     //   PC_DispStr(  2, 7,"                                ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY); 
      //      PC_DispStr( 46, 7,"                                ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY); 
		    //PC_DispStr(  2, 9,"                                ", DISP_FGND_GREEN + DISP_BGND_LIGHT_GRAY); 
      //      PC_DispStr( 46, 9,"                                ", DISP_FGND_GREEN + DISP_BGND_LIGHT_GRAY); 
			PC_DispStr(  2, 8,"Go through the street turn Left  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
            PC_DispStr( 46, 8,"Go through the street turn Left  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
		    OSTimeDlyHMSM(0,0,0,500); 
			PC_DispStr(  2, 8,"                                 ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
            PC_DispStr( 46, 8,"                                 ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
		    OSTimeDlyHMSM(0,0,0,500);  
		    PC_DispStr(  2, 8,"Go through the street turn Left  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
            PC_DispStr( 46, 8,"Go through the street turn Left  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
		} 
		OSTimeDlyHMSM(0,0,1,0); 
		OSTaskResume(13);                                                                                     /*唤醒Task2                                   */ 
        OSTaskSuspend(OS_PRIO_SELF);   
	} 
} 
 
/*$PAGE*/ 
/* 
********************************************************************************************************* 
*                                               TASK #4 
* 
* Description:南北方向,用黄色的显示“请减速通过路口左拐”,同时闪烁50秒结束。 
*               
*              
********************************************************************************************************* 
*/ 
 
void  Task4 (void *pdata) 
{ 
#if OS_CRITICAL_METHOD == 3 
    OS_CPU_SR  cpu_sr; 
#endif 
     
    pdata = pdata; 
    for (;;) 
    { 
		PC_DispStr(  2, 8,"                                  ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY); 
        PC_DispStr( 39, 8,"                                  ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY); 
		PC_DispStr(  2,14,"                                  ", DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
		PC_DispStr( 46,14,"                                  ", DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
	    for(i=1;i<5;i++)                                                                                      /*显示“请减速通过路口左拐”,同时闪烁50秒结束*/ 
		{ 
			//PC_DispStr(  2, 8,"                                ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY); 
			//PC_DispStr( 39, 8,"                                ", DISP_FGND_RED + DISP_BGND_LIGHT_GRAY); 
			//PC_DispStr(  2,14,"                                ", DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
			//PC_DispStr( 46,14,"                                ", DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
			PC_DispStr(  2,15,"Go through the street turn Left   ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
            PC_DispStr( 46,15,"Go through the street turn Left   ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
		    OSTimeDlyHMSM(0,0,0,500); 
            PC_DispStr(  2,15,"                                  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
            PC_DispStr( 46,15,"                                  ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
		    OSTimeDlyHMSM(0,0,0,500); 
            PC_DispStr(  2,15,"Go through the street turn Left   ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
            PC_DispStr( 46,15,"Go through the street turn Left   ", DISP_FGND_YELLOW + DISP_BGND_LIGHT_GRAY); 
		}                      
		OSTimeDlyHMSM(0,0,1,0);  
		OSTaskResume(12);                                                                                      /*唤醒Task1                                   */ 
        OSTaskSuspend(OS_PRIO_SELF); 
	} 
} 
 
/*$PAGE*/ 
/* 
********************************************************************************************************* 
*                                               TASK #5 
* 
* Description: 东西向安装一检测器,在东西向通行1分钟后,检测南、北向等候汔车数分别在第6行2、36列位置 
*              以橙色显示“向南行等候汔车数为X位”、 “向北行等候汔车数为Y”。 
*               
********************************************************************************************************* 
*/ 
 
void  Task5 (void *pdata) 
{ 
#if OS_CRITICAL_METHOD == 3 
    OS_CPU_SR  cpu_sr; 
#endif 
    char   t[10]; 
    pdata = pdata; 
    for (;;) 
    {   
		if(c) 
		{ 
			srand((unsigned)time(NULL)); 
			p = random(100); 
            m=rand()%p; 
            //OSSemPend(RandomSem, 0, &err);             /* Acquire semaphore to perform random numbers        */ 
			//if(err == OS_NO_ERR) 
			//{ 
            //m = random(1000);                          /* make a random number in the range 0 to 1000        */ 
            //n = random(1000);                          /* make a random number in the range 0 to 1000        */ 
            sprintf(South_wait,"%s %2d %s","There are",m,"cars ------> South"); 
            PC_DispStr(  2, 14,South_wait, DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
            srand((unsigned)time(NULL)); 
            n=rand()%p; 
		    sprintf(North_wait,"%s %2d %s","There are",n,"cars ------> North"); 
		    PC_DispStr( 46, 14,North_wait, DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
			if(x+y > 0 && x+y < 200){ 
	        sprintf(t, "%5d", ((x+y) - (m+n))/(m+n));                                                           /* Display #id                        */ 
		    PC_DispStr(  2, 19,t, DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
	        sprintf(t, "%5d", ((m+n) - (x+y))/(x+y));                                                           /* Display #id                        */ 
		    PC_DispStr(  2, 20,t, DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
				p1 = (((x+y) - (m+n))/(m+n)); 
				if (p1 > 0){ 
					id = 15;} 
				p2 = (((m+n) - (x+y))/(x+y)); 
				if (p2 > 0){ 
					id = 5;} 
			/*if (((x+y) - (m+n))/(m+n) >1){  
				id = 15;} 
			else if (((m+n) - (x+y))/(x+y) >1){ 
				id =  5;}*/ 
			if (p1 <1 && p2 <1){ 
				id = 10;} 
			} 
            //OSSemPost(RandomSem);                      /* Release semaphore                                  */ 
			//} 
			c=FALSE; 
		} 
		else 
		{ 
            //OSSemPend(RandomSem, 0, &err);             /* Acquire semaphore to perform random numbers        */ 
			//if(err == OS_NO_ERR) 
			//{ 
            //m = random(1000);                          /* make a random number in the range 0 to 1000        */ 
            //n = random(1000);                          /* make a random number in the range 0 to 1000        */ 
			srand((unsigned)time(NULL)); 
			p = random(100); 
            x=rand()%p; 
		    sprintf(West_wait,"%s %2d %s","There are",x,"cars ------> West"); 
            PC_DispStr(  2,  7,West_wait, DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
			srand((unsigned)time(NULL)); 
            y=rand()%p; 
		    sprintf(East_wait,"%s %2d %s","There are",y,"cars ------>  East"); 
			PC_DispStr( 46,  7,East_wait, DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
            //OSSemPost(RandomSem);                      /* Release semaphore                                  */ 
			//} 
	        sprintf(t, "%5d", ((m+n) - (x+y))/(x+y));                                                           /* Display #id                        */ 
		    PC_DispStr( 46, 19,t, DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
	        sprintf(t, "%5d", ((x+y) - (m+n))/(m+n));                                                           /* Display #id                        */ 
		    PC_DispStr( 46, 20,t, DISP_FGND_BLUE + DISP_BGND_LIGHT_GRAY); 
            p1 = (((m+n) - (x+y))/(x+y)); 
			if (p1 >0){ 
			//if (((m+n) - (x+y))/(x+y) >1){ 
				id = 15;}//} 
			//else if (((x+y) - (m+n))/(m+n) >1){  
				//id =  5;} 
			//else{ 
			//	id = 10;} 
			p2 = (((x+y) - (m+n))/(m+n)); 
			if (p2 >0){ 
				id = 5;} 
			if (p1 <1 && p2 <1){ 
				id = 10;} 
			c=TRUE; 
		} 
        OSTimeDly(500);                                  /* Delay 500 clock tick                                 */ 
		OSTaskSuspend(OS_PRIO_SELF); 
    } 
} 
 
/*$PAGE*/ 
/* 
********************************************************************************************************* 
*                                               TASK #6 
* 
* Description:  
*               
********************************************************************************************************* 
*/ 
 
void  Task6 (void *pdata) 
{ 
#if OS_CRITICAL_METHOD == 3 
    OS_CPU_SR  cpu_sr; 
#endif 
     
    pdata = pdata; 
    for (;;) 
    { 
		ss=OSMboxPend(Str_Box,10,&err); 
		if(err==OS_NO_ERR) 
		{ 
			if(d) 
			{ 
				PC_DispStr(   2,  7,ss, DISP_FGND_GREEN + DISP_BGND_LIGHT_GRAY); 
                PC_DispStr(  46,  7,ss, DISP_FGND_GREEN + DISP_BGND_LIGHT_GRAY); 
				d=FALSE; 
			} 
			else 
			{ 
                 PC_DispStr(  2, 14,ss, DISP_FGND_GREEN + DISP_BGND_LIGHT_GRAY); 
                 PC_DispStr( 46, 14,ss, DISP_FGND_GREEN + DISP_BGND_LIGHT_GRAY); 
				 d=TRUE; 
			} 
		} 
		OSTimeDlyHMSM(0,0,1,0);                                    /* Wait one second                    */                   
		//OSTaskSuspend(OS_PRIO_SELF); 
    } 
} 
 
 
/*$PAGE*/ 
/* 
********************************************************************************************************* 
*                                           UPDATE THE DISPLAY 
********************************************************************************************************* 
*/ 
 
static  void  TaskStartDisp (void) 
{ 
    char   s[80]; 
 
 
#if OS_TASK_STAT_EN > 0 
	sprintf(s, "%5d", OSTaskCtr);                                  /* Display #tasks running               */ 
    PC_DispStr(18, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); 
 
    sprintf(s, "%3d", OSCPUUsage);                                 /* Display CPU usage in %               */ 
    PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); 
 
	sprintf(s, "%5d", OSCtxSwCtr);                                 /* Display #context switches per second */ 
    PC_DispStr(18, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); 
 
#endif 
 
    sprintf(s, "V%1d.%02d", OSVersion() / 100, OSVersion() % 100); /* Display uC/OS-II's version number    */ 
    PC_DispStr(75, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); 
 
    switch (_8087) {                                               /* Display whether FPU present          */ 
        case 0: 
             PC_DispStr(71, 22, " NO  FPU ", DISP_FGND_YELLOW + DISP_BGND_BLUE); 
             break; 
 
        case 1: 
             PC_DispStr(71, 22, " 8087 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE); 
             break; 
 
        case 2: 
             PC_DispStr(71, 22, "80287 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE); 
             break; 
 
        case 3: 
             PC_DispStr(71, 22, "80387 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE); 
             break; 
    } 
} 
 
 
/* 
********************************************************************************************************* 
*                                               CLOCK TASK 
********************************************************************************************************* 
*/ 
 
void  TaskClk (void *pdata) 
{ 
    char  s[40]; 
 
 
    pdata = pdata; 
    for (;;) { 
        PC_GetDateTime(s); 
        PC_DispStr(60, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); 
        OSTimeDlyHMSM(0, 0, 0, 500);                             
    } 
}