freertos队列或互斥

时间:2018-04-08 09:53:21

标签: queue mutex freertos

我是实时编程的新手,我正在努力练习。

在我正在处理的示例中:Task1必须定期更改一个名为frequency的变量,每次使用新频率时task2都会闪烁。

我应该在共享变量上使用互斥量" Freq"或使用队列定期发送任务1和任务2的频率。

1 个答案:

答案 0 :(得分:1)

如果只有一个任务正在更改变量,而所有其他任务(在您的情况下只有一个)正在读取变量,那么您根本不需要保护变量,前提是该变量可以写入一个变量走。因此,如果这是32位架构且变量为32位,则无需保护。另一方面,如果它是一个8位架构,变量是32位,则需要4次写入才能更新所有32位,变量需要保护。只有当只有一个编写器时才会出现这种情况 - 如果有多个任务写入变量,则需要保护。

但是,只更新变量不会向读取任务发出变量已发生变化的信号。为了提高效率,您可能只希望在变量更改时执行读取任务,在这种情况下,您可以在队列上发送更新的变量,并在队列中阻止读取任务,并在队列中有数据时自动解除阻塞({{ 3}}) - 取决于更新的频率,虽然将更新的变量作为直接任务通知直接发送到任务可能更有效,并且在通知(https://www.freertos.org/Embedded-RTOS-Queues.html)上阻止了阅读任务。