曲径通幽论坛

标题: 实例:信号量集的简单应用 [打印本页]

作者: beyes    时间: 2009-4-14 02:03
标题: 实例:信号量集的简单应用
目的:熟悉信号量集的基本应用
代码:
#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);
  }

}





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2