☰
RTOS学习笔记,八、队列集
2026/10/5 19:18:08 网站建设 项目流程

输入设备比如红外遥控器,它们的驱动程序应该只传递键值,而不应该在程序里涉及按键控制的代码。

比如:红外遥控器驱动程序里,它只应该把键值记录下来、写入某个队列,它不应该把键值转换为游戏的控制键。这样,这个驱动程序就可以在其他工程里继续直接复用,一般情况下就不要修改。

队列集

问题1

此时红外遥控器产生的队列再写输出端的队列,控制输出端的任务,虽然这种办法确实能将两边的代码分开,按键代码专注于读取按键,游戏代码专注于控制游戏,但我们想要多个设备来控制游戏时,比如用旋转编码器,用MPU6050姿态控制时,一个任务就要生成一个队列, 每个任务生成一个栈,会消耗很多内存浪费资源。

改进1

此时只创建一个input task任务读取下面三个队列,然后再写输出端的队列

问题2

此时input task轮流读取三个队列,有数据的话就处理。

此时三个任务超时时间只能给0:假设接收第一个队列超时时间给30分钟,当第一个队列三十分钟内都没发数据,那其他任务就算有数据也只能等三十分钟才能继续接收。

那么这就导致这个任务不断地运行,一直都没有阻塞,浪费CPU资源

改进2

使用队列集,队列集也是队列,但里面放的是队列的句柄。

例子:

1.创建队列A,B

2.创建队列集S

3.将队列A,B加入队列集S

4.在input task任务中不断读队列集S

写队列A的时候会判断一下队列A是不是属于一个队列集,属于时,写队列A时会顺便把A的句柄写入队列集S。

同样写队列B,会把队列B的句柄写入队列集S。

在input task读队列集可以得到一个句柄,返回的句柄非空时,就可以去读这个句柄

程序框图(思路)

此时完整框图如下

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询