freeRTOS:如何在任务之间传递数据?

时间:2017-01-07 00:29:33

标签: c microcontroller stm32 freertos

我正在寻找一个示例,它提供了在任务之间传递数据的正确方法:

让我们说我有一个显示器,键盘和一些传感器,例如。内部ADC。 我想在显示器上显示所有传感器的值。按下按钮后,更改视图并显示一些文本。在按下另一个之后,回到价值观。

我会使用全局变量,但它在任何地方都被描述为一个坏主意。另一方面,如果我使用队列(xQueueCreate,xQueueReceive,xQueueSend),我不会有所有数据显示它,我相信在收到它们之后创建一个副本只会丢失内存。

1 个答案:

答案 0 :(得分:2)

你已经提到了一些可能的解决方案,但是说你因为复制数据而丢失了内存,如果你想保护这些数据,即从两个不同的地方写入,总是如此,无论如何只需使用你已经使用的FreeRTOS决定放弃大量内存,即上下文切换,任务处理和FreeRTOS使用的所有其他资源。可能的解决方案是:

  1. 全局变量 - 之所以这是一个坏主意的原因,是因为 理想情况下,您希望限制对变量(范围)的访问。同样很难 保持安全,因为在任务切换期间其他任务可以写入 相同的变量,可能会破坏您的数据。但如果你 保护它,即使用某种标志锁定变量, 这是完美的解决方案,并使用sempahore或队列来通知显示任务数据已被填充。

  2. 队列 - 您可以从多个任务发送并且正如您所说的保持变量的显示任务副本,它是更安全的选项,并且它不必丢失内存,因为您不必存储在任何其他地方,您可以只读取传感器,然后将其放入队列,然后当您在显示任务中收到它时,您可以更改以前的值。因此读取数据的任务就是说ADC不需要在读取之间存储它。

  3. 队列 - 但你提议的有点不同,如果你在系统中有直接流,让我们先说你检查键盘,然后是传感器,然后你可以用TASK1发送队列的其他东西 - > TASK2 - > TASK3 - > ... TASKX - > DISPLAY_TASK这种方式变量会有一定的流量,你可以确保你总是将所有数据放在一个地方。
  4. 您可以在所有结构中使用相同的参数(taskCreation中的pvParameters),因此您将指向相同的结构,在这种情况下保护数据,您可以在写入变量时使用互斥(因此您只知道一个任务时间可以访问这个变量)。您也可以在全局变量选项中使用互斥锁。