freertos 队列或互斥锁
freertos queue or mutex
我是实时编程的新手,我正在努力练习。
在我正在处理的示例中:Task1 必须定期更改一个名为 frequency 的变量,而 task2 每次都会以新频率闪烁 LED。
我应该在共享变量上使用互斥量 "Freq" 还是使用队列定期发送来自任务 1 和任务 2 的频率。
如果只有一个任务正在更改变量,而所有其他任务(在您的情况下只有一个任务)正在读取变量,那么您根本不需要保护变量,前提是变量可以写入一个走。所以如果这是一个32位的架构,变量是32位的,那么就不需要保护了。另一方面,如果它是 8 位架构并且变量是 32 位,那么将需要 4 次写入来更新所有 32 位并且变量需要保护。这仅在只有一个编写器时才成立——如果有多个任务正在写入变量,那么它就需要保护。
但是,仅仅更新变量并不会向读取任务发出变量已更改的信号。为了提高效率,您可能只希望在变量更改时执行读取任务,在这种情况下,您可以将更新后的变量发送到队列中,并让读取任务在队列中阻塞,并在队列中有数据时自动解除阻塞(https://www.freertos.org/Embedded-RTOS-Queues.html) - depending on the frequency of update though it might be more efficient to send the updated variable directly to the task as a direct to task notification, and have the reading task blocked on the notification (https://www.freertos.org/RTOS-task-notifications.html).
我是实时编程的新手,我正在努力练习。
在我正在处理的示例中:Task1 必须定期更改一个名为 frequency 的变量,而 task2 每次都会以新频率闪烁 LED。
我应该在共享变量上使用互斥量 "Freq" 还是使用队列定期发送来自任务 1 和任务 2 的频率。
如果只有一个任务正在更改变量,而所有其他任务(在您的情况下只有一个任务)正在读取变量,那么您根本不需要保护变量,前提是变量可以写入一个走。所以如果这是一个32位的架构,变量是32位的,那么就不需要保护了。另一方面,如果它是 8 位架构并且变量是 32 位,那么将需要 4 次写入来更新所有 32 位并且变量需要保护。这仅在只有一个编写器时才成立——如果有多个任务正在写入变量,那么它就需要保护。
但是,仅仅更新变量并不会向读取任务发出变量已更改的信号。为了提高效率,您可能只希望在变量更改时执行读取任务,在这种情况下,您可以将更新后的变量发送到队列中,并让读取任务在队列中阻塞,并在队列中有数据时自动解除阻塞(https://www.freertos.org/Embedded-RTOS-Queues.html) - depending on the frequency of update though it might be more efficient to send the updated variable directly to the task as a direct to task notification, and have the reading task blocked on the notification (https://www.freertos.org/RTOS-task-notifications.html).