Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Queue 如何在freeRTOS中向多模块接收器发送队列消息?_Queue_Freertos_Esp32 - Fatal编程技术网

Queue 如何在freeRTOS中向多模块接收器发送队列消息?

Queue 如何在freeRTOS中向多模块接收器发送队列消息?,queue,freertos,esp32,Queue,Freertos,Esp32,我正在寻找一种在freeRTOS中使用队列广播消息的方法,我提出了不同的想法,但每个想法都有不同的问题 我所拥有的: 队列的项类型是一个结构,其属性指示消息是广播消息还是特定任务的消息。 将向队列写入消息的广播任务。 一个队列管理器任务,如果收到任何新消息,它将查看队列,如果消息有目的地,它将恢复该特定任务或恢复所有任务(如果是广播)。 对于接收者任务,我提出了以下想法: 如果我使用了接收函数xQueueReceive,则任务队列中的第一个任务将读取消息并将其从队列中删除,并且使用该函数,其他任

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

我所拥有的:

队列的项类型是一个结构,其属性指示消息是广播消息还是特定任务的消息。 将向队列写入消息的广播任务。 一个队列管理器任务,如果收到任何新消息,它将查看队列,如果消息有目的地,它将恢复该特定任务或恢复所有任务(如果是广播)。 对于接收者任务,我提出了以下想法:

如果我使用了接收函数xQueueReceive,则任务队列中的第一个任务将读取消息并将其从队列中删除,并且使用该函数,其他任务将无法读取该广播消息。另一方面,它是针对特定任务的定向消息的完美理由。 如果我使用peedk函数xQueuePeek,消息将永远不会从队列中删除,除非我使用xQueueReceive,这是一种在同一任务中重复的peek和receive,meeh,丑陋的编码,我不能使用任何其他删除函数,因为它将删除整个队列。但这将解决特定任务的信息,为了解决广播消息,我需要为每个接收任务设置优先级,只有优先级最低的任务才会使用xQueueReceive从队列中删除该消息,并且所有接收任务在偷看或读取后都会挂起,因此它们不会再次读取该消息。我不确定如何处理队列管理器任务因为我不能挂起它,它会一直通知队列中的新消息,直到最后一个任务接收到它,但整个系统需要等待低优先级任务运行,以删除该消息和在此期间接收到的任何新消息,因此不会实时读取该消息。 我仍然在考虑其他方法,比如为每个接收任务使用新队列或队列,但我还不确定哪种方法是最好的。我不知道是否还有其他原因可以在不使用队列技术的情况下广播消息

我需要告诉你,这个计划不是为一个特定的项目。我只是尝试以不同的方式使用队列技术。我已经找到了另一篇关于广播消息的帖子,但这是针对一个特定的问题,他们在解决这个问题时没有使用队列技术。我只想将这是一条广播消息发送到队列中,所有接收者都能够一次性读取它


谢谢。

是FreeRTOS中唯一的广播机制。您可以使用事件组取消阻止所有应使用队列查看功能从队列读取的任务,然后了解所有任务何时已读取数据,以便删除数据。

是FreeRTOS中唯一的广播机制。您可以使用事件组取消阻止所有应使用队列查看功能从队列中读取的任务,然后了解所有任务何时已读取数据,以便删除数据。

这很有意义。这样,就不需要使用suspend和resume任务函数。谢谢你,这很有道理。这样,就不需要使用suspend和resume任务函数。非常感谢。