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 = &amt;TaskStartStk[TASK_STK_SIZE - 1]; /* TaskStart() will use Floating-Point */
pbos = &amt;TaskStartStk[0];
size = TASK_STK_SIZE;
OSTaskStkInit_FPE_x86(&amt;ptos, &amt;pbos, &amt;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(&amt;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,
&amt;TaskClkStk[TASK_STK_SIZE - 1],
TASK_CLK_PRIO,
TASK_CLK_ID,
&amt;TaskClkStk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task1,
(void *)0,
&amt;Task1Stk[TASK_STK_SIZE - 1],
TASK_1_PRIO,
TASK_1_ID,
&amt;Task1Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task2,
(void *)0,
&amt;Task2Stk[TASK_STK_SIZE - 1],
TASK_2_PRIO,
TASK_2_ID,
&amt;Task2Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task3,
(void *)0,
&amt;Task3Stk[TASK_STK_SIZE - 1],
TASK_3_PRIO,
TASK_3_ID,
&amt;Task3Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task4,
(void *)0,
&amt;Task4Stk[TASK_STK_SIZE-1],
TASK_4_PRIO,
TASK_4_ID,
&amt;Task4Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task5,
(void *)0,
&amt;Task5Stk[TASK_STK_SIZE-1],
TASK_5_PRIO,
TASK_5_ID,
&amt;Task5Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task6,
(void *)0,
&amt;Task6Stk[TASK_STK_SIZE-1],
TASK_6_PRIO,
TASK_6_ID,
&amt;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, &amt;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 &amt;&amt; 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 &amt;&amt; p2 <1){
id = 10;}
}
//OSSemPost(RandomSem); /* Release semaphore */
//}
c=FALSE;
}
else
{
//OSSemPend(RandomSem, 0, &amt;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 &amt;&amt; 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,&amt;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);
}
}