我正在寻找一个示例,介绍任务之间传递数据的正确方法:freeRTOS:如何在任务之间传递数据?
可以说我有一个显示器,键盘和一些传感器,例如。内部ADC。 我想在显示屏上显示所有传感器的值。按下按钮后,更改视图并显示一些文本。按下另一个后,返回值。
我会使用全局变量,但它无处不描述为一个坏主意。在另一方面,如果我使用队列(xQueueCreate,xQueueReceive,xQueueSend),我不会有所有的数据,以显示它,我认为,他们接受刚刚失去记忆之后创建副本。
我正在寻找一个示例,介绍任务之间传递数据的正确方法:freeRTOS:如何在任务之间传递数据?
可以说我有一个显示器,键盘和一些传感器,例如。内部ADC。 我想在显示屏上显示所有传感器的值。按下按钮后,更改视图并显示一些文本。按下另一个后,返回值。
我会使用全局变量,但它无处不描述为一个坏主意。在另一方面,如果我使用队列(xQueueCreate,xQueueReceive,xQueueSend),我不会有所有的数据,以显示它,我认为,他们接受刚刚失去记忆之后创建副本。
你已经提到了一些可能的解决方案,但是说你因为复制数据而丢失了内存,如果你想从两个不同的地方写入数据,总会遇到这种情况,无论如何只需使用FreeRTOS已经决定放弃很多内存来处理上下文切换,任务处理以及FreeRTOS使用的所有其他资源。可能的解决方案是:
全局变量 - 原因就是为什么它是一个糟糕的主意,是因为 最好要限制访问变量(范围)。也很难 保证它的安全,因为在任务切换等任务可能要 写相同的变量,并可能损坏数据。但是,如果你 保护它的权利,即使用某种标志的锁变量, 这是完全正常的解决方案,并采用即sempahore或排队通知显示任务的数据被填满。
队列 - 你可以从多个任务发送信息,正如你所说的保持显示任务副本的变量,这是更安全的选项,它不必丢失内存,因为你不必丢失它任何其他地方,您只需读取传感器,然后将其放入队列中,然后当您在显示任务中收到它时,就会更改以前的值。所以读取数据的任务可以说ADC不需要在读取之间存储它。
没有什么错误使用队列。 http://www.freertos.org/Embedded-RTOS-Queues.html – OldProgrammer