繁体   English   中英

FreeRTOS锁定和任务

[英]FreeRTOS locks and tasks

什么时候我应该在像cortex-m3这样的东西上使用freertos? 使用多核系统似乎很清楚,但单核心呢?

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

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

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

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

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

lock_t l; // defines a lock of your system

// thread 1:
lock(l);
counter += 1;
unlock(l);


// thread 2:
lock(l);
do_something(counter);
unlock(l);

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

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

在FreeRTOS中,一个简单的方法就是使用一个基本的临界区:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM