gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:47:23 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

25 4 0