硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3793|回复: 3
收起左侧

[有问必答] 407+FREERTOS消息队列问题,消息队列内容错误

[复制链接]

4

主题

18

回帖

30

积分

新手上路

积分
30
发表于 2021-7-31 09:43:12 | 显示全部楼层 |阅读模式
硬汉哥,不好意思,重复占用论坛资源,我发现发到具体的某一个专项里,好像不能引起观注。
另外,也请教硬汉哥一下,我这样写是否有问题?
背景描述:
1.send 和 recv 两个任务,send做为发送任务,recv做为接收任务
2.send任务中,连结发送两条消息,内容不同 value1和value2
3.recv任务中,接收到两条内容 value2 和 value2

伪代码:
static void sendToQueue(uint8_t cmd,uint8_t *buff,uint8_t len)
{
    MOTORCTRL_QUEUE_T *ptMotor = &gMotorCtrlQueue;

    ptMotor->len = 0;
    memset(ptMotor->data,0x00,MOTORCTRL_QUEUE_BUF_LEN);

    ptMotor->cmd = cmd;
    ptMotor->len = len;
    memcpy(ptMotor->data,buff,len);

        /* 使用消息队列实现指针变量的传递 */
        if(xQueueSend(gxMotorCtrlQueue,             /* 消息队列句柄 */
                                 (void *) &ptMotor,             /* 发送结构体指针变量ptReader的地址 */
                                 (TickType_t)20) != pdPASS )
        {
           xQueueReset(gxMotorCtrlQueue);
           DBG("A the queue is error!\r\n");
       }     
}



void send(void)
{
    sendToQueue(CMD_AA,"\x55\X55\X55\X55",4);
    sendToQueue(CMD_BB,"\xAA\XAA\XAAXAA",4);
}

接收任务:

static void vRecv(void *pvParameters)
{
    while (1)
    {

        //获取到,则执行上位机指令,获取不到,则执行状态查询
        xReturn = xQueueReceive( gxMotorCtrlQueue,    /* 消息队列的句柄 */
                                 (void *)&ptMotor,  /*这里获取的是结构体的地址 */
                                 (TickType_t)30); /* 设置阻塞时间 */

   }
   if(pdTRUE == xReturn)
   {
      printf_hex(ptMotor->data);
   }
   vTaskDelay(50);
}

然后我的打印日志是

AA AA AA AA
AA AA AA AA

预期值应该是:
55 55 55 55
AA AA AA AA

但是不知道为什么,就只能收到第二条消息发送过来的内容,有大神知道原因吗?感谢。

回复

使用道具 举报

4

主题

18

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-7-31 10:02:52 | 显示全部楼层
本帖最后由 surge 于 2021-7-31 10:13 编辑

大神们,是时候教育教育小白了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-7-31 14:47:09 | 显示全部楼层
初步来看是Send任务优先级高,而Recv任务优先级,并且你做的是地址传递,导致数据覆盖,接收到的都是最后一个发送的数据。

简单些,send任务优先级低,而recv优先级高应该可以解决。
回复

使用道具 举报

4

主题

18

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-8-2 10:51:17 | 显示全部楼层
eric2013 发表于 2021-7-31 14:47
初步来看是Send任务优先级高,而Recv任务优先级,并且你做的是地址传递,导致数据覆盖,接收到的都是最后一 ...

收到,感谢硬汉哥。昨天休息没看。
问题的原因就是您说的,是地址传递,导致数据覆盖,接收到的都是最后一个发送的数据,我在声明的时候,把这两个任务弄了不同的存储空间,暂时先用。
后面,我会试下您说的修改优先级这个方法。试完后,过来回复。
再次感谢硬汉哥。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 14:14 , Processed in 0.257094 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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