主题 : ucos 消息队列 取消息数据的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 44029
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2011-04-21
最后登录: 2012-08-16
楼主  发表于: 2012-08-15 15:24

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

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<MSG_QUEUE_SIZE)//本消息队列是否已满
{
    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= 1 queue_data->OSMsg= 15 msgSend .
msgSend msg 16 queue_data.OSNMsgs= 2queue_data->OSMsg= 16 msgSend .
msgSend msg 17 queue_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