mutex - 在 FreeRTOS 中使用流缓冲区时,是否可以使用互斥体代替临界区?

标签 mutex message-queue freertos critical-section mutual-exclusion

我正在研究使用 FreeRTOS 中的流缓冲区将 CAN 帧从多个任务传输到 ISR,一旦准备就绪,它就会将它们放入 CAN 传输缓冲区。使用说明书here解释了一个流缓冲区只能由一个任务/isr 使用并由一个任务/isr 读取,如果不是,则需要一个临界区。

在这种情况下能否使用互斥体代替临界区?使用它会更有意义吗?

最佳答案

首先,如果您要发送短的离散帧,您可能需要考虑 message buffer而不是流缓冲区。

是的,你可以使用互斥量。

如果从多个任务发送,要考虑的主要事情是当流缓冲区变满时会发生什么。如果您使用的是不同的 FreeRTOS 对象(消息缓冲区除外,消息缓冲区是在流缓冲区上构建的),那么多个任务试图写入一个已满的对象的同一实例时,它们都会阻止他们尝试写入该对象,并在对象中的空间可用时自动解除阻塞 - 无论任务进入阻塞状态的顺序如何,最高优先级的等待任务将首先被解除阻塞。但是,对于流/消息缓冲区,您只能阻止一个任务尝试写入已满缓冲区 - 如果缓冲区受静音保护 - 所有其他任务都会阻塞在互斥锁上。这可能意味着低优先级任务在流/消息缓冲区上被阻塞,而高优先级任务在互斥体上被阻塞——一种优先级反转。

关于mutex - 在 FreeRTOS 中使用流缓冲区时,是否可以使用互斥体代替临界区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59451419/

相关文章:

windows - Windows服务器的企业消息队列系统

Redis Pub/Sub 持久化

c++ - 在开关盒内阻塞

c++ - 可以通过其他获取操作获取负载重新排序吗? cppreference 说只有非原子的和宽松的通过 acquire 排序

delphi - 如何使用互斥体保护公共(public)资源?

c - 同步线程,互斥量

apache-kafka - 如何处理消息队列中乱序的消息?

c - 防止c中字符数组溢出

partitioning - 我们真正可以在 ESP32 中使用多少 NVS 数据?