曲径通幽论坛

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

实例:消息队列简单应用

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2009-4-14 02:02:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的:熟悉消息队列的简单应用
代码:
#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];

  INT16S key;
  INT8U   err;
  INT8U   y = 0;
  OS_EVENT  *Str_Q;

  char *ss;
  char *s100;
  char *s;
  char *s500;

  void  *MsgGrp[N_MESSAGES];     /*消息数组,消息数组存放着各消息的指针*/


  void StartTask(void *data);
  void  MyTask(void *data);
  void  YouTask(void *data);

void  main (void)
{

  PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);     
  OSInit();                                             
  PC_DOSSaveReturn();                                   
  PC_VectSet(uCOS, OSCtxSw);                           

  Str_Q = OSQCreate( &MsgGrp[0], N_MESSAGES ); /*建立消息队列,参数为消息指针数组的首址

                                                                                                 和数组长度*/

  OSTaskCreate(StartTask, (void *)0, &StartTaskStk[TASK_STK_SIZE - 1], 0);
  OSStart();                                           

}


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);


  s = "how many times this str can receive?";

  for(;;)
  {
  if( OSTimeGet()>100 && OSTimeGet()<500 )
  {
   s100 = "The value of OSTime is between 100 and 500";

   OSQPostFront( Str_Q, s100 );            /*后进先出的方式安插消息*/

   s = "which task  received this str?";

   OSQPostFront( Str_Q, s );                  /*后进先出的方式安插消息*/

  }

  if( OSTimeGet()>5000 && OSTimeGet()<5500 )
  {
   s500 = "The value of OSTime is between 5000 and 5500";

   OSQPostFront( Str_Q,s500 );            /*后进先出的方式安插消息*/
  }


  if( PC_GetKey(&key) == TRUE )
  {
   if( key == 0x1B )
   {
    PC_DOSReturn();
    }


  }
     OSTimeDlyHMSM(0,0,1,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 (;;)
   {
   ss = OSQPend(Str_Q,0,&err);            /*请求消息*/

   PC_DispStr(10,++y,ss,DISP_BGND_BLACK + DISP_FGND_WHITE);

   OSTimeDlyHMSM(0,0,1,0);

   }

}

void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
  OS_CPU_SR  cpu_sr;
#endif

  pdata = pdata;

  for (;;)
   {
   ss = OSQPend(Str_Q,0,&err);                   /*请求消息*/

    PC_DispStr(10,10,ss,DISP_BGND_BLACK + DISP_FGND_WHITE);

   OSTimeDlyHMSM(0,0,1,0);
  }

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

本版积分规则

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

GMT+8, 2024-5-19 08:52 , Processed in 0.062126 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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