注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
eleis的个人空间 https://home.eeworld.com.cn/space-uid-313719.html [收藏] [复制] [分享] [RSS]
日志

ucos 消息队列 取消息数据的问题

已有 1212 次阅读2012-8-15 14:58

问题是将消息数据填入队列,经查询消息得出的结果也对,但是等待消息函数得到的结果却总是最后一条消息数据,很纳闷,不知怎么解? 请大侠们赐教

我的目标是假如我将消息数据取出来之后,可以通过对不同的数据做判断而进行不同的函数调用。例如:见【红色部分】

void msgSend(void* pdata)//消息队列发送添加任务
{
  INT8U msg=SYS_RECV0;//需要发出消息 SYS_RECV0=15 【消息数据初始】
  OS_Q_DATA queue_data;//保存从消息队列事件控制块中获取的数据信息
  INT32U *data, *data2;
  OS_Q_DATA *pq;
  
  while(1)
  {
    OSQQuery(s_QDRecv0MsgQueue,&queue_data);//查询本消息队列信息
     data=queue_data.OSMsg;
        UartStrInt(\"queue_data.OSNMsgs=\", queue_data.OSNMsgs);  // 调试输出
        UartStrInt(\"queue_data->OSMsg=\", *data);                           // 调试输出

     
    if(queue_data.OSNMsgs     {
      UartSendString(\"msgSend .\\r\\n\");
      OSQPostOpt(s_QDRecv0MsgQueue,(void*)&msg,OS_POST_OPT_NONE);//OS_POST_OPT_BROADCAST  //OS_POST_OPT_FRONT  【将初始数据填入队列】

      //pq = (OS_Q_DATA *)s_QDRecv0MsgQueue->OSEventPtr;
     // data2=pq->OSMsg;
     // UartStrInt(\"data2\",*data2);
      //将消息通过队列广播给所有需要等待消息的任务
      msg++;//产生新的消息
      UartStrInt(\"msgSend  msg \\r\\n\", msg);
    }
    else//
    {
      OSTimeDlyHMSM(0,0,1,0);//队列满,延时1s
    }
  }
}

void msgRev1(void* pdata)//消息队列接收任务1void msgSend(void* pdata)//消息队列发送添加任务
{
  
  OS_Q_DATA queue_data;
  INT8U return_code=OS_NO_ERR;
  INT32U *data;
  INT8U *msg;
  while(1)
  {
   
    OSQQuery(s_QDRecv0MsgQueue,&queue_data);//查询本消息队列信息
    data=queue_data.OSMsg;
     UartStrInt(\"Rev1queue_data.OSNMsgs=\", queue_data.OSNMsgs);
     UartStrInt(\"Rev1queue_data->OSMsg=\", *data); // 调试输出

    if(!queue_data.OSNMsgs)//本消息队列是否已满
    {
       UartSendString(\"msgRev1  SYS_RECV0 send over.\\r\\n\");   // 调试输出

    }else
    {
      
        msg=(INT8U*)OSQPend(s_QDRecv0MsgQueue,WAIT_FOREVER,&return_code);
        if(*msg==SYS_RECV0)  //例如:【这里 如果我取到 SYS_RECV0 这个数据 我就可以做另外的函数调用】
        {
          UartSendString(\"msgRev1  SYS_RECV0 .\\r\\n\");  // 调试输出

        }
        UartStrInt(\"msgRev1  msg \\r\\n\", *msg);   // 调试输出

    }
   
    //接收消息,如果没有接收到就一直等待
  //  IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, 0x01);   
    OSTimeDlyHMSM(0,0,0,100);//延时300ms
  }
}

这是调试结果:
queue_data.OSNMsgs=  0
queue_data->OSMsg=  -442503144
msgSend .
msgSend  msg 15
queue_data.OSNMsgs=  1queue_data->OSMsg=  15  msgSend .
msgSend  msg  16
queue_data.OSNMsgs=  2queue_data->OSMsg=  16 msgSend .
msgSend  msg  17queue_data.OSNMsgs=  3
queue_data->OSMsg=  17 msgSend .
msgSend  msg  18
queue_data.OSNMsgs=  4
queue_data->OSMsg=  18msgSend .
msgSend  msg  19   queue_data.OSNMsgs=  5  queue_data->OSMsg=  19msgSend .
msgSend  msg   20  queue_data.OSNMsgs=  6  queue_data->OSMsg=  20msgSend .
msgSend  msg   21 queue_data.OSNMsgs=  7  queue_data->OSMsg=  21msgSend .
msgSend  msg   22 queue_data.OSNMsgs=  8 queue_data->OSMsg=  22msgSend .
msgSend  msg   23 queue_data.OSNMsgs=  9 queue_data->OSMsg=  23msgSend .
msgSend  msg   24 queue_data.OSNMsgs=  10 queue_data->OSMsg=  24
Rev1queue_data.OSNMsgs=  10 Rev1queue_data->OSMsg=  24 msgRev1  msg   24  【主要问题在这里:为什么不是从 15 到 14 ,结果都是 24 ,】
Rev1queue_data.OSNMsgs=  9  Rev1queue_data->OSMsg=  24  msgRev1  msg  24
Rev1queue_data.OSNMsgs=  8  Rev1queue_data->OSMsg=  24 msgRev1  msg  24
Rev1queue_data.OSNMsgs=  7  Rev1queue_data->OSMsg=  24  msgRev1  msg  24
Rev1queue_data.OSNMsgs=  6  Rev1queue_data->OSMsg=  24  msgRev1  msg  24
Rev1queue_data.OSNMsgs=  5  Rev1queue_data->OSMsg=  24  msgRev1  msg  24
Rev1queue_data.OSNMsgs=  4  Rev1queue_data->OSMsg=  24  msgRev1  msg  24
Rev1queue_data.OSNMsgs=  3  Rev1queue_data->OSMsg=  24  msgRev1  msg  24
Rev1queue_data.OSNMsgs=  2  Rev1queue_data->OSMsg=  24 msgRev1  msg  24
Rev1queue_data.OSNMsgs=  1 Rev1queue_data.OSNMsgs=  1 queue_data->OSMsg=  24
msgSend .
msgSend  msg   25  queue_data.OSNMsgs=  2  queue_data->OSMsg=  25msgSend .
msgSend  msg   26  queue_data.OSNMsgs=  3  queue_data->OSMsg=  26msgSend .
msgSend  msg
  27queue_data.OSNMsgs=  4queue_data->OSMsg=  27msgSend .
msgSend  msg
  28queue_data.OSNMsgs=  5queue_data->OSMsg=  28msgSend .
msgSend  msg
  29queue_data.OSNMsgs=  6queue_data->OSMsg=  29msgSend .
msgSend  msg
  30queue_data.OSNMsgs=  7queue_data->OSMsg=  30msgSend .
msgSend  msg
  31queue_data.OSNMsgs=  8queue_data->OSMsg=  31msgSend .
msgSend  msg
  32queue_data.OSNMsgs=  9queue_data->OSMsg=  32msgSend .
msgSend  msg
同理。。。。。。这样一直下去
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章