FreeRtos消息队列

一.消息队列简介

        队列又称消息队列,是一种常用于任务间的通信数据结构,队列可以在任务与任务间,中断和任务间传递信息,实现任务接收来自其它任务或中断的不固定长度的消息。

二.消息队列数据存储

        通常队列采用先进先出(FIFO)的存储缓冲机制,也就是往队列发送数据的时候(也叫入队)永 远都是发送到队列的尾部,而从队列提取数据的时候(也叫出队)是从队列的头部提取的,也可使用LIFO的存储缓冲(后进先出)。数据发送到队列中会导致数据拷贝,也就是将要发送的数据拷贝到队列中,这就意味着在队列中存储的是数据的原始值,而不是原数据的引用(即只传递数据的指针,这个也叫做值传递)。FreeRTOS采用值传递的方法,这虽然会导致数据拷贝,会浪费一点时间,但是一旦将消息发送到队列中原始的数据缓冲区就可以删除掉或者覆写,这样的话这些缓冲区就可以被重复的使用。

三.出队阻塞

        当任务尝试从一个队列中读取消息的时候可以指定一个阻塞时间,这个阻塞时间就是任务以队列中读取消息无效的时候任务阻塞的时间。例如任务A用于处理从串口中接收的数据,串口接收到数据之后会将数据放置队列Q中,任务A从Q中获取数据。但是如果Q队列此时为空时,任务A无法获取到数据,这时任务A有三个选择:1.直接跑路。2.等一会看看数据到了没,没到就走。3.一直等等队列Q中有数据为止。选哪一个就是由这个阻塞时间决定的,这个阻塞时间 单位是时钟节拍数。阻塞时间为 0 的话就是不阻塞,没有数据的话就马上返回任务继续执行接 下来的代码,对应第一种选择。如果阻塞时间为 0~ portMAX_DELAY,当任务没有从队列中获 取到消息的话就进入阻塞态,阻塞时间指定了任务进入阻塞态的时间,当阻塞时间到了以后还 没有接收到数据的话就退出阻塞态,返回任务接着运行下面的代码,如果在阻塞时间内接收到 了数据就立即返回,执行任务中下面的代码,这种情况对应第二种选择。当阻塞时间设置为 portMAX_DELAY 的话,任务就会一直进入阻塞态等待,直到接收到数据为止!这个就是第三种选择。

四.入队阻塞

        入队指的是向队列发送消息,将消息加入到队列中和出队阻塞是一样的,当一个任务向队列发送消息时也可以设置阻塞时间。若此时队列Q是满的,那对应上面三种情况,等待队列的空位来发送消息。

五.队列操作图示

1.创建队列

2.向队列发送消息 

3.发送第二个消息 

4.读取消息 

六.常用函数

1.消息队列创建函数 xQueueCreate()

       动态创建方法: 使用xQueueCreate创建队列时,使用的是动态内存分配,在使用之前需将FreeRtosConfig.h中把configSUPPORT_DYNAMIC_ALLOCATION</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值