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);
在你的具体例子中,有一个 reader 和一个作者(所以在 "general" 的情况下不是,在有多个作者的情况下绝对不是)那么我建议如果变量 written/read 是体系结构的自然字大小,则不需要锁,如果变量不是体系结构的自然字大小,则需要锁。
在你的例子中,字的大小是 32 位,所以如果变量是 uint32_t 那么它将自动更新,一个 writer 和多个 readers 是安全的。另一方面,如果变量是 uint64_t 那么它将在两次单独的访问中被更新(写入),并且您必须确保 reader 不会在两次更新之间访问变量这样做会读取损坏的(更新一半的)值。
在 FreeRTOS 中,一个简单的方法是使用基本的临界区:
taskENTER_CRITICAL();
My64BitVariable++;
taskEXIT_CRITICAL();
但最好的方法取决于事件发生的频率。如果事件是 "not too fast",那么为什么不使用 queue, in which case FreeRTOS takes care of all the concurrency issues for you. Better (faster and less RAM) still, depending on what the receiving task is doing, have the writing task send the value to the receiving task directly using a direct to task notification.
将值从一个任务发送到另一个任务
我什么时候应该在 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);
在你的具体例子中,有一个 reader 和一个作者(所以在 "general" 的情况下不是,在有多个作者的情况下绝对不是)那么我建议如果变量 written/read 是体系结构的自然字大小,则不需要锁,如果变量不是体系结构的自然字大小,则需要锁。
在你的例子中,字的大小是 32 位,所以如果变量是 uint32_t 那么它将自动更新,一个 writer 和多个 readers 是安全的。另一方面,如果变量是 uint64_t 那么它将在两次单独的访问中被更新(写入),并且您必须确保 reader 不会在两次更新之间访问变量这样做会读取损坏的(更新一半的)值。
在 FreeRTOS 中,一个简单的方法是使用基本的临界区:
taskENTER_CRITICAL();
My64BitVariable++;
taskEXIT_CRITICAL();
但最好的方法取决于事件发生的频率。如果事件是 "not too fast",那么为什么不使用 queue, in which case FreeRTOS takes care of all the concurrency issues for you. Better (faster and less RAM) still, depending on what the receiving task is doing, have the writing task send the value to the receiving task directly using a direct to task notification.
将值从一个任务发送到另一个任务