我正在寻找一个示例,它提供了在任务之间传递数据的正确方法:
让我们说我有一个显示器,键盘和一些传感器,例如。内部ADC。 我想在显示器上显示所有传感器的值。按下按钮后,更改视图并显示一些文本。在按下另一个之后,回到价值观。
我会使用全局变量,但它在任何地方都被描述为一个坏主意。另一方面,如果我使用队列(xQueueCreate,xQueueReceive,xQueueSend),我不会有所有数据显示它,我相信在收到它们之后创建一个副本只会丢失内存。
答案 0 :(得分:2)
你已经提到了一些可能的解决方案,但是说你因为复制数据而丢失了内存,如果你想保护这些数据,即从两个不同的地方写入,总是如此,无论如何只需使用你已经使用的FreeRTOS决定放弃大量内存,即上下文切换,任务处理和FreeRTOS使用的所有其他资源。可能的解决方案是:
全局变量 - 之所以这是一个坏主意的原因,是因为 理想情况下,您希望限制对变量(范围)的访问。同样很难 保持安全,因为在任务切换期间其他任务可以写入 相同的变量,可能会破坏您的数据。但如果你 保护它,即使用某种标志锁定变量, 这是完美的解决方案,并使用sempahore或队列来通知显示任务数据已被填充。
队列 - 您可以从多个任务发送并且正如您所说的保持变量的显示任务副本,它是更安全的选项,并且它不必丢失内存,因为您不必存储在任何其他地方,您可以只读取传感器,然后将其放入队列,然后当您在显示任务中收到它时,您可以更改以前的值。因此读取数据的任务就是说ADC不需要在读取之间存储它。