#include "includes.h"
#define TASK_STK_SIZE 512
OS_STK StartTaskStk[TASK_STK_SIZE];
OS_STK MyTaskStk[TASK_STK_SIZE]; /* Tasks stacks */
OS_STK YouTaskStk[TASK_STK_SIZE];
OS_STK HerTaskStk[TASK_STK_SIZE];
INT16S key;
char *s1 = "MyTask is running";
char *s2 = "YouTask is running";
char *s3 = "HerTask is running";
char *ss = "Mytask require the semaphore";
INT8U err;
INT8U y = 0;
INT32U times = 0;
OS_EVENT *Semp;
void StartTask(void *data);
void MyTask(void *data); /* Function prototypes of Startup task */
void YouTask(void *data);
void HerTask(void *data);
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 */
Semp = OSSemCreate(1);
OSTaskCreate(StartTask, (void *)0, &StartTaskStk[TASK_STK_SIZE - 1], 0);
OSStart(); /* Start multitasking */
}
void StartTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata = pdata; /* Prevent compiler warning */
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 */
OSTaskCreate(MyTask,(void *)0, &MyTaskStk[TASK_STK_SIZE - 1], 3);
OSTaskCreate(YouTask,(void *)0, &YouTaskStk[TASK_STK_SIZE - 1], 4);
OSTaskCreate(HerTask,(void *)0, &HerTaskStk[TASK_STK_SIZE - 1], 5);
for(;;)
{
if( PC_GetKey(&key) == TRUE )
{
if( key == 0x1B )
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,3,0);
}
}
void MyTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata = pdata; /* Prevent compiler warning */
for (;;)
{
OSTimeDlyHMSM(0,0,0,200);
PC_DispStr(10,++y,ss,DISP_BGND_BLACK + DISP_FGND_WHITE);
OSSemPend(Semp,0,&err);
PC_DispStr(10,++y,s1,DISP_BGND_BLACK + DISP_FGND_WHITE);
OSSemPost(Semp);
OSTimeDlyHMSM(0,0,0,200);
}
}
void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
for (;;)
{
PC_DispStr(10,++y,s2,DISP_BGND_BLACK + DISP_FGND_WHITE);
OSTimeDlyHMSM(0,0,0,300);
}
}
void HerTask( void *pdata )
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
for(;;)
{
OSSemPend( Semp,0,&err);
PC_DispStr(10,++y,s3,DISP_BGND_BLACK + DISP_FGND_WHITE);
for( times; times<20000000; times++ )
{
OS_Sched();
}
OSSemPost( Semp );
OSTimeDlyHMSM(0,0,1,0);
}
}
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |