硬汉嵌入式论坛

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

[FreeRTOS] 还是没有理解消息队列,麻烦给我讲解下

[复制链接]

91

主题

289

回帖

562

积分

金牌会员

积分
562
发表于 2016-12-12 00:01:50 | 显示全部楼层 |阅读模式
我现在想用串口中断接收8个数据,然后在中断中将这个数据发到消息队列中,然后在一个任务中接收这个消息队列,就是处理串口接收到的数据。(不知道是不是这样使用的)

/* 创建消息队列*/
xQueue1 = xQueueCreate(8, sizeof(uint8_t));


/* 串口中断处理函数,将串口接收的数据作为信息 */
uint8_t RxData[8];
void HAL_UART_RxCpltCallback (UART_HandleTypeDef *huart)
{
    BaseType_t xResult;
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;   
   
    xQueueSendFromISR(xQueue1,
                    (void *)&RxData,                                        /* RxData保存串口接收的数据 */
                    &xHigherPriorityTaskWoken);

    HAL_UART_Receive_IT(&huart1, RxData,8);                /* 使能接收中断 */
    /* 消息被成功发出 */
    if( xResult != pdFAIL )
    {
        /* 如果xHigherPriorityTaskWoken = pdTRUE,那么退出中断后切到当前最高优先级任务执行 */
        portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
    }
}


uint8_t ucQueueMsgValue[8];
static void vTaskMsgPro(void *pvParameters)
{
   
    BaseType_t xResult;
    const TickType_t xMaxBlockTime = pdMS_TO_TICKS(300); /* 设置最大等待时间为300ms */
   
    int i = 0;
   
    while(1)
    {
        xResult = xQueueReceive(xQueue1,                   /* 消息队列句柄 */
                                (void *)&ucQueueMsgValue,  /* 存储接收到的数据到变量ucQueueMsgValue中 */
                                (TickType_t)xMaxBlockTime);/* 设置阻塞时间 */
        if(xResult == pdPASS)
        {
            /* 成功接收,并通过串口将数据打印出来 */
            for (i=0; i<8; i++)
            {
                printf("接收到消息队列数据ucQueueMsgValue = %d\r\n", ucQueueMsgValue);
            }
        }
    }
}

此时打印出来的只有ucQueueMsgValue[0]是对的,其他的7个都是0
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2016-12-14 10:10:14 | 显示全部楼层
可以这么创建

创建8个选项,每个选项的大小是8个字节,这样的话,你接受够8个字节后。
xQueue1 = xQueueCreate(8, 8);

直接在中断函数里面调用  xQueueSendFromISR发送就可以了,这样接收端,一次就可以接收到8个数据,不需要分8次接受了。
回复

使用道具 举报

91

主题

289

回帖

562

积分

金牌会员

积分
562
 楼主| 发表于 2016-12-14 14:13:34 | 显示全部楼层
谢谢!
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2017-3-4 09:01:20 | 显示全部楼层

回 eric2013 的帖子

eric2013:可以这么创建

创建8个选项,每个选项的大小是8个字节,这样的话,你接受够8个字节后。
xQueue1 = xQueueCreate(8, 8);

....... (2016-12-14 10:10) 
我搞不懂啊,为什么我在中断中发送的一个字符串,可是在任务中收到的只是字符串的第一字符,请问是为什么啊?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2017-3-4 09:32:29 | 显示全部楼层

回 jun503380 的帖子

jun503380:

我搞不懂啊,为什么我在中断中发送的一个字符串,可是在任务中收到的只是字符串的第一字符,请问是为什么啊?
1, 创建:
1.png

2.  中断发送:
2.png

3.  接收:
3.png

4.  效果:
4.png
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2017-3-4 10:09:37 | 显示全部楼层

回 eric2013 的帖子

创建对列
QQ截图20170304100532.jpg
向队列发送字符串
QQ截图20170304100627.jpg
读队列 QQ截图20170304100713.jpg
这是写的测试代码,就是我上面说的现象,请您帮我看看什么问题。谢谢
[/quote][quote]
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2017-3-4 10:12:49 | 显示全部楼层

回 jun503380 的帖子

jun503380: (2017-03-04 10:09) 
你的创建错了,创建的每个选项大小是一个字节,所以每次只能发送1个字节大小的选项。
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2017-3-4 10:20:59 | 显示全部楼层

回 eric2013 的帖子

eric2013:你的创建错了,创建的每个选项大小是一个字节,所以每次只能发送1个字节大小的选项。 (2017-03-04 10:12) 
谢谢 !!!知道我错在什么地方了!
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2017-3-4 11:30:15 | 显示全部楼层

回 eric2013 的帖子

eric2013:你的创建错了,创建的每个选项大小是一个字节,所以每次只能发送1个字节大小的选项。 (2017-03-04 10:12) 
还有一个问题请教你一下,收到队列以后,队列里面的内容并没有被清空,本来就是是样子的吗?若是这样子的,我读取队列以后需要怎样清空队列里的内容呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2017-3-4 11:44:24 | 显示全部楼层

回 jun503380 的帖子

jun503380:还有一个问题请教你一下,收到队列以后,队列里面的内容并没有被清空,本来就是是样子的吗?若是这样子的,我读取队列以后需要怎样清空队列里的内容呢? (2017-03-04 11:30) 
不需要你去清空,消息队列有指针的,会挪动位置的,这个就是所谓的FIFO机制。
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2017-3-4 11:49:31 | 显示全部楼层
哦!是这样子的!谢谢!!!
回复

使用道具 举报

2

主题

20

回帖

26

积分

新手上路

积分
26
发表于 2017-4-2 09:40:55 | 显示全部楼层

回 eric2013 的帖子

eric2013:不需要你去清空,消息队列有指针的,会挪动位置的,这个就是所谓的FIFO机制。 (2017-03-04 11:44) 
请教一下队列大小的设置问题,假设要在两个task之间传递3个uint32_t类型参数,那么FIFO机制下队列设置多大QUEUE_LENGTH比较合适,有什么通用标准么?xQueueCreate( QUEUE_LENGTH, 3*(uint32_t) );   如果极限情况QUEUE_LENGTH=1 会出现什么问题?
现行谢过
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2017-4-2 09:56:55 | 显示全部楼层

回 xranger 的帖子

xranger:请教一下队列大小的设置问题,假设要在两个task之间传递3个uint32_t类型参数,那么FIFO机制下队列设置多大QUEUE_LENGTH比较合适,有什么通用标准么?xQueueCreate( QUEUE_LENGTH, 3*(uint32_t) );   如果极限情况QUEUE_LENGTH=1 会出现什么问题?
现行谢过 (2017-04-02 09:40) 
可以设置成一个。这样就跟uCOS-II里面的消息邮箱一样,也是一个。


看你的处理机制了,最好不要有发送速度超过接收速度的情况,要不很容易就满了。FIFO的大小,主要也是这种情况容易出问题。满了也没有关系,就是你的数据不能够实时处理了,要等待消息队列有空间。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 08:35 , Processed in 0.250964 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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