如何在freeRTOS中将队列消息发送到多接收器?

问题描述 投票:0回答:1

我正在寻找一种在freeRTOS中使用队列广播消息的方法,我提出了不同的想法,但是每个人都有不同的问题。

我有什么:

  • 队列的项目类型是带有属性的结构,用于指示消息是广播消息还是用于特定任务。
  • 将消息发送到队列的广播任务。
  • 一个队列管理器任务,如果接收到任何新消息并且该消息具有目的地,它将在队列上进行窥探,然后它将恢复该特定任务,或者如果是广播,它将恢复所有任务。
  • 对于接收器任务,我想出了这些想法:

    1. 如果我使用接收功能xQueueReceive,则仅任务队列中的第一个任务将读取该消息并将其从队列中删除,并且其他任务将无法读取该广播消息。另一方面,这是为什么要发送定向消息(针对特定任务的消息)的完美原因。
    2. 如果我使用peedk函数xQueuePeek,则除非我使用xQueueReceive,否则该消息永远不会从队列中删除,这是多余的(在相同的任务中进行窥视和接收,很糟糕,编码很丑)并且我不能使用任何其他删除功能,因为它将删除整个队列。但这将解决特定任务的消息,并且要解决广播消息,我需要为每个接收任务设置优先级,只有优先级最低的任务才会使用xQueueReceive从队列中删除该消息,并接收所有任务在查看或阅读后将暂停自身,因此他们不会再读取该消息(我不确定该如何处理队列管理器任务,因为我无法将其暂停,并且它将一直通知队列中的新消息,直到最后一个任务收到了该消息),但是整个系统将需要等待该低优先级的任务运行才能删除该消息和该时间收到的任何新消息,因此不会实时读取。

我仍在考虑其他方法,例如对每个接收任务使用新队列或队列,但是我不确定哪种方法是最佳方法。而且我不知道是否还有其他原因即使不使用队列技术也要广播消息。

我需要告诉您,该程序不适用于特定项目。我只是想以不同的方式使用队列技术。而且我已经找到了其他有关广播消息的帖子,但这是针对特定问题的,他们无需使用队列技术即可解决该问题。我只想向队列发送“这是一条广播消息”,并且所有接收者都可以读取一次(仅一次)。

谢谢。

queue freertos esp32
1个回答
0
投票

Event groups是FreeRTOS中唯一的广播机制。您可以使用事件组使用队列偷看功能来解除阻止所有应从队列中读取的任务,然后使用xEventGroupSync()来了解所有任务何时已读取数据,因此应将其删除。

© www.soinside.com 2019 - 2024. All rights reserved.