FreeRTOS锁定和任务

时间:2016-04-15 13:07:51

标签: c multithreading multitasking freertos

什么时候应该使用freertos在cortex-m3之类的东西?使用多核系统似乎很明显,但单核心呢?

例如,我有两个任务。首先,我增加名为counter的变量。当某些事件发生时,第二个任务保存该变量的当前值。我应该在这里使用锁吗?可能先破坏第二个任务正在保存的值吗?

3 个答案:

答案 0 :(得分:2)

是的,您应该使用锁来保护对共享资源的访问。

您无法确定编译器为读取共享变量而生成的序列是否为原子序列,因此可能不安全。

如果你想要更加强硬,可能获得性能,你可以使用各种方法来实际确保变量可以以原子方式访问。见评论。

答案 1 :(得分:1)

您需要使用锁来同步对共享对象的并发访问,最简单的方案是:

build-essential

答案 2 :(得分:0)

在您的具体示例中,有一个读者和一个编写者(所以不是“一般”情况,绝对不是在有多个编写者的情况下)然后我建议如果变量是不需要锁定write / read是体系结构的自然字大小,如果变量不是体系结构的自然字大小,则需要它。

在你的情况下,字大小是32位,所以如果变量是uint32_t,那么它将以原子方式更新,并且一个编写器和多个读取器是安全的。另一方面,如果变量是uint64_t,那么它将在两次单独的访问中更新(写入),并且您必须确保读者不会访问两次更新之间的变量,因为这样做会读取损坏的(一半更新)价值。

在FreeRTOS中,一个简单的方法就是使用基本的关键部分:

taskENTER_CRITICAL();
My64BitVariable++;
taskEXIT_CRITICAL();

最好的方法取决于事件的频率。如果事件“不太快”,那么为什么不使用queue将值从一个任务发送到另一个任务,在这种情况下,FreeRTOS会为您处理所有并发问题。更好(更快,更少RAM),取决于接收任务正在做什么,让写作任务直接使用direct to task notification将值发送到接收任务。