FreeRTOS队列集:多资源阻塞问题的解决方案
在开发日益复杂的嵌入式应用程序时,我们常常会遇到这样的情况:需要在一个特定任务中对多个FreeRTOS资源进行阻塞操作。也就是说,任务需要一种方法来暂停执行,直到一组感兴趣的队列或信号量中发生某个事件。FreeRTOS提供了队列集(Queue Set)来解决这个问题。
问题提出
假设我们要编写一个程序,通过三个按钮获取GPIO输入。当按钮按下时,LED熄灭;按钮释放后,LED点亮,同时还会触发一些游戏事件。由于这是一个游戏应用,多个按钮可以同时被按下。为了尽可能及时响应按钮事件,我们使用中断来检测GPIO信号的变化。
最初,我们可能会分配一个队列来存储所有按钮事件。但按钮触点可能会产生抖动,特别是金属触点的按钮。当玩家想要按下另一个按钮激活智能炸弹时,这个队列可能会被某个按钮的抖动事件填满。由于中断服务程序(ISR)在队列满时不能阻塞,所以事件可能会丢失。
为了解决这个问题,我们决定为每个按钮分配一个单独的消息队列。这样,如果某个按钮抖动过于频繁,只会丢失该按钮的事件。现在,我们有了三个用于输入处理的消息队列。
然而,输入事件处理任务是一个单一任务。理想情况下,在循环的开始,任务应该阻塞,直到从这三个队列中的任何一个接收到事件。但 xQueueReceive() 函数一次只能从一个队列接收数据。作为一种变通方法,我们可以对三个队列进行零超时轮询,但如果没有更多的事件需要处理,最好暂停执行,以便为游戏代码的其他部分留出更多的CPU时间。
队列集的引入
为了解决在多个队列上进行阻塞的问题,FreeRTOS的队列集应运而生。
超级会员免费看
订阅专栏 解锁全文
946

被折叠的 条评论
为什么被折叠?



