如何在 freeRTOS 中向多个接收者发送队列消息?
How to send queue message to multipule receiver in freeRTOS?
我正在寻找一种在 freeRTOS 中使用队列广播消息的方法,我提出了不同的想法,但每个想法都有不同的问题。
我有:
- 队列的项目类型是一个结构,其属性指示消息是广播还是特定任务。
- 将消息写入队列的广播任务。
- 一个队列管理器任务,如果收到任何新消息,它将查看队列,如果消息有目的地,那么它将恢复该特定任务或恢复所有任务(如果它是广播)。
对于 Receiver 任务,我提出了这些想法:
- 如果我使用接收函数
xQueueReceive
只有任务队列中的第一个任务会读取消息并将其从队列中删除,这样,其他任务将无法读取该广播消息。另一方面,它是定向消息(针对特定任务的消息)的完美原因。
- 如果我使用 peedk 函数
xQueuePeek
消息永远不会从队列中删除,除非我使用 xQueueReceive
这有点多余(peek 和 receive 在同一个任务中,meh,丑陋的编码)而且我不能使用任何其他删除功能,因为它会删除整个队列。但这将解决特定任务的消息,并解决广播消息我需要为每个接收任务设置优先级,只有优先级最低的任务才会使用 xQueueReceive
从队列中删除该消息和所有接收任务将在偷看或阅读后自行暂停,因此他们不会再次阅读该消息(我不确定如何处理队列管理器任务,因为我无法暂停它并且它会不断通知队列中的新消息直到最后一个任务收到它),但是整个系统将需要等待那个低优先级任务 运行 删除该消息和在那段时间收到的任何新消息,它不会被实时读取。
我仍在考虑其他方法,例如为每个接收任务使用新队列或队列,但我不确定哪种方法最好。而且我不知道是否还有其他原因即使不使用队列技术也要广播消息。
我需要告诉你这个程序不是针对特定项目的。我只是想以不同的方式使用队列技术。我已经找到了其他 post 关于广播消息的内容,但这是针对特定问题的,他们在不使用队列技术的情况下解决了该问题。我只想将 "this is a broadcast message" 发送到队列,所有接收方都能够读取它一次(仅一次)。
谢谢。
Event groups are the only broadcast mechanism in FreeRTOS. You could use an event group to unblock all tasks that should read from a queue using the queue peek function, then xEventGroupSync() 了解所有任务何时读取数据以便删除数据。
我正在寻找一种在 freeRTOS 中使用队列广播消息的方法,我提出了不同的想法,但每个想法都有不同的问题。
我有:
- 队列的项目类型是一个结构,其属性指示消息是广播还是特定任务。
- 将消息写入队列的广播任务。
- 一个队列管理器任务,如果收到任何新消息,它将查看队列,如果消息有目的地,那么它将恢复该特定任务或恢复所有任务(如果它是广播)。
对于 Receiver 任务,我提出了这些想法:
- 如果我使用接收函数
xQueueReceive
只有任务队列中的第一个任务会读取消息并将其从队列中删除,这样,其他任务将无法读取该广播消息。另一方面,它是定向消息(针对特定任务的消息)的完美原因。 - 如果我使用 peedk 函数
xQueuePeek
消息永远不会从队列中删除,除非我使用xQueueReceive
这有点多余(peek 和 receive 在同一个任务中,meh,丑陋的编码)而且我不能使用任何其他删除功能,因为它会删除整个队列。但这将解决特定任务的消息,并解决广播消息我需要为每个接收任务设置优先级,只有优先级最低的任务才会使用xQueueReceive
从队列中删除该消息和所有接收任务将在偷看或阅读后自行暂停,因此他们不会再次阅读该消息(我不确定如何处理队列管理器任务,因为我无法暂停它并且它会不断通知队列中的新消息直到最后一个任务收到它),但是整个系统将需要等待那个低优先级任务 运行 删除该消息和在那段时间收到的任何新消息,它不会被实时读取。
- 如果我使用接收函数
我仍在考虑其他方法,例如为每个接收任务使用新队列或队列,但我不确定哪种方法最好。而且我不知道是否还有其他原因即使不使用队列技术也要广播消息。
我需要告诉你这个程序不是针对特定项目的。我只是想以不同的方式使用队列技术。我已经找到了其他 post 关于广播消息的内容,但这是针对特定问题的,他们在不使用队列技术的情况下解决了该问题。我只想将 "this is a broadcast message" 发送到队列,所有接收方都能够读取它一次(仅一次)。
谢谢。
Event groups are the only broadcast mechanism in FreeRTOS. You could use an event group to unblock all tasks that should read from a queue using the queue peek function, then xEventGroupSync() 了解所有任务何时读取数据以便删除数据。