打印
[牛人杂谈]

FreeRTOS应用-队列

[复制链接]
970|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wanduzi|  楼主 | 2017-10-11 10:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
  队列是任务间通讯的一种方式。可以在任务与任务间、中断和任务间传送信息。大多数情况下,队列用于具有线程保护的FIFO(先进先出)缓冲区:新数据放在队列的后面。当然,数据也可以放在队列的前面,在下一篇讲队列API函数时,会涉及到数据的存放位置。       在嵌入式操作系统中队列是任务间数据交换的常用手段,队列是生产者消费者模型的重要组成部分。FreeRTOS的队列简单易用,下面结合一个具体例子说明FreeRTOS中的队列如何使用。



沙发
wanduzi|  楼主 | 2017-10-11 10:28 | 只看该作者
队列的应用过程:
1. xQueueHandle MsgQueue;
声明一个队列句柄,队列句柄可以理解成一个队列的标记,不同的队列具有不同的标记

2. MsgQueue = xQueueCreate( 5 , sizeof( int16_t ) );
创建队列,即在内容中开辟固定大小的区域。FreeRTOS中需指定队列的深度和每个元素的字节长度,如果队列的深度为1那么便和uCOS的消息邮箱用法相似。

使用特权

评论回复
板凳
wanduzi|  楼主 | 2017-10-11 10:28 | 只看该作者
3. xQueueSend( MsgQueue, ( void* )&SendNum, 0 );
向队列中填充内容,第二参数需要取出地址并进行类型转换,第三个参数设置等待时间,在队列满的情况下再往队列中填充内容的话便会阻塞任务,直到等待时间溢出;若此处填充的内容为0的话,则立即返回插入队列结果(成功或失败)。如果希望使用先进先出队列,使用API函数xQueueSend()或xQueueSendToBack()向队列投递队列项。如果希望使用后进先出队列,使用API函数xQueueSendToFront()向队列投递队列项。如果在中断服务程序中,切记使用它们的带中断保护版本。

使用特权

评论回复
地板
wanduzi|  楼主 | 2017-10-11 10:29 | 只看该作者
4. xQueueReceive( MsgQueue, &ReceiveNum, 100/portTICK_RATE_MS )
从队列中取出内容,第二个参数需要取出地址,第三个参数为等待最大时间,若在等待的时间内队列中没有数据则返回阻塞任务。

注:中断程序中绝不可以使用不带“FromISR”结尾的API函数!

使用特权

评论回复
5
huahuagg| | 2017-10-11 11:40 | 只看该作者
队列是个不错的选择。好多工作可以使用这个套路实现。

使用特权

评论回复
6
xinpian101| | 2017-10-11 13:48 | 只看该作者
顺序模式执行任务就是先进先出。

使用特权

评论回复
7
xinpian101| | 2017-10-11 13:49 | 只看该作者
我认为就穿插入新的任务,也要先执行之前的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

1732

帖子

3

粉丝