5405|0

6

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ucos 消息队列 取消息数据的问题 [复制链接]

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

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

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 到 24 ,结果都是 24 ,】
Rev1queue_data.OSNMsgs=  9  Rev1queue_data->OSMsg=  24  msgRev1  msg  24  【主要问题在这里:为什么不是从 15 到 24 ,结果都是 24 ,】

Rev1queue_data.OSNMsgs=  8  Rev1queue_data->OSMsg=  24 msgRev1  msg  24    【主要问题在这里:为什么不是从 15 到 24 ,结果都是 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
同理。。。。。。这样一直下去

[ 本帖最后由 eleis 于 2012-8-15 15:00 编辑 ]
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表