|
目的:熟悉信号量集的基本应用
代码:#include "includes.h"
#define N_MESSAGES 128
#define TASK_STK_SIZE 512
OS_STK StartTaskStk[TASK_STK_SIZE];
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YouTaskStk[TASK_STK_SIZE];
OS_STK HerTaskStk[TASK_STK_SIZE];
INT16S key;
INT8U err;
INT8U y = 0;
OS_FLAG_GRP *Sem_F; /*定义事件标志组指针*/
char *s1 = "MyTask is running";
char *s2 = "YouTask is running";
char *s3 = "HerTask is running";
void StartTask(void *data);
void MyTask(void *data);
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 */
Sem_F = OSFlagCreate( 0,&err ); /*建立一个事件标志组,0初始化*/
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;
for (;;)
{
OSFlagPend( Sem_F,(OS_FLAGS)3,0x82,0,&err ); /*申请事件标志,类型为所有标志都置位且
得到信号后将信号"消费掉"*/
PC_DispStr(10,++y,s1,DISP_BGND_BLACK + DISP_FGND_WHITE);
OSTimeDlyHMSM(0,0,2,0);
}
}
void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
for (;;)
{
PC_DispStr(10,++y,s2,DISP_BGND_BLACK + DISP_FGND_WHITE);
OSTimeDlyHMSM(0,0,8,0);
OSFlagPost( Sem_F, (OS_FLAGS)2, OS_FLAG_SET, &err ); /*发出第2束信号量*/
OSTimeDlyHMSM(0,0,2,0);
}
}
void HerTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
for (;;)
{
PC_DispStr(10,++y,s3,DISP_BGND_BLACK + DISP_FGND_WHITE);
OSFlagPost( Sem_F, (OS_FLAGS)1, OS_FLAG_SET, &err ); /*发出第1束信号量*/
OSTimeDlyHMSM(0,0,1,0);
}
} |
|