sha*_*dow 1 queue freertos esp32
我正在寻找一种在 freeRTOS 中使用队列广播消息的方法,我提出了不同的想法,但每个人都有不同的问题。
我拥有的:
对于接收器任务,我提出了这些想法:
xQueueReceive只有任务队列中的第一个任务会读取消息并将其从队列中删除,这样其他任务将无法读取该广播消息。另一方面,这是定向消息(针对特定任务的消息)的完美原因。xQueuePeek,消息将永远不会从队列中删除,除非我使用xQueueReceive它有点多余(在同一个任务中查看和接收,meeh,丑陋的编码)并且我不能使用任何其他删除函数,因为它会删除整个队列。但这将解决特定任务的消息,为了解决广播消息,我需要为每个接收任务设置优先级,并且只有优先级最低的任务才会使用xQueueReceive 从队列中删除该消息,所有接收任务将在偷看或阅读后暂停自己,这样他们就不会再次阅读该消息(我不确定如何处理队列管理器任务,因为我无法暂停它,它会保持队列中的新消息的通知,直到最后一个任务收到它),但整个系统将需要等待该低优先级任务运行以删除该消息以及在该时间内收到的任何新消息,它将不会被读入真实的时间。我仍在考虑其他方法,例如为每个接收任务使用新队列或队列,但我不确定哪种方法是最好的。而且我不知道是否还有其他原因即使不使用队列技术也要广播消息。
我需要告诉你这个程序不是针对特定项目的。我只是想以不同的方式使用队列技术。我已经找到了关于广播消息的其他帖子,但这是针对特定问题的,他们在不使用队列技术的情况下解决了该问题。我只想将“这是一条广播消息”发送到队列,并且所有接收器都能够读取一次(仅一次)。
谢谢你。
小智 5
事件组是 FreeRTOS 中唯一的广播机制。您可以使用事件组来解除阻塞所有应该使用队列窥视功能从队列中读取的任务,然后xEventGroupSync()知道所有任务何时都读取了数据,因此应该删除数据。