2017-01-07 22 views
0

我正在寻找一个示例,介绍任务之间传递数据的正确方法:freeRTOS:如何在任务之间传递数据?

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

我会使用全局变量,但它无处不描述为一个坏主意。在另一方面,如果我使用队列(xQueueCreate,xQueueReceive,xQueueSend),我不会有所有的数据,以显示它,我认为,他们接受刚刚失去记忆之后创建副本。

+1

没有什么错误使用队列。 http://www.freertos.org/Embedded-RTOS-Queues.html – OldProgrammer

回答

1

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

  1. 全局变量 - 原因就是为什么它是一个糟糕的主意,是因为 最好要限制访问变量(范围)。也很难 保证它的安全,因为在任务切换等任务可能要 写相同的变量,并可能损坏数据。但是,如果你 保护它的权利,即使用某种标志的锁变量, 这是完全正常的解决方案,并采用即sempahore或排队通知显示任务的数据被填满。

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

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