[牛人杂谈] FreeRTOS应用-队列

[复制链接]
1314|6
 楼主| wanduzi 发表于 2017-10-11 10:27 | 显示全部楼层 |阅读模式
  队列是任务间通讯的一种方式。可以在任务与任务间、中断和任务间传送信息。大多数情况下,队列用于具有线程保护的FIFO(先进先出)缓冲区:新数据放在队列的后面。当然,数据也可以放在队列的前面,在下一篇讲队列API函数时,会涉及到数据的存放位置。       在嵌入式操作系统中队列是任务间数据交换的常用手段,队列是生产者消费者模型的重要组成部分。FreeRTOS的队列简单易用,下面结合一个具体例子说明FreeRTOS中的队列如何使用。
6632084813954608628.png


 楼主| 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函数!
huahuagg 发表于 2017-10-11 11:40 | 显示全部楼层
队列是个不错的选择。好多工作可以使用这个套路实现。
xinpian101 发表于 2017-10-11 13:48 | 显示全部楼层
顺序模式执行任务就是先进先出。
xinpian101 发表于 2017-10-11 13:49 | 显示全部楼层
我认为就穿插入新的任务,也要先执行之前的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

1882

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部