曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 9128|回复: 0
打印 上一主题 下一主题

实例:信号量集的简单应用

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2009-4-14 02:03:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的:熟悉信号量集的基本应用
代码:
#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);
  }

}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 07:39 , Processed in 0.063207 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表