我正在研究在FreeRTOS中使用流缓冲区将CAN帧从多个任务传输到ISR,ISR将这些帧在准备就绪后立即放入CAN发送缓冲区中。手册here解释说,流缓冲区仅应由一个任务/ isr使用,而应由一个任务/ isr读取,如果没有,则需要一个关键部分。
在这种情况下,可以使用互斥锁代替关键部分吗?使用会更有意义吗?
首先,如果要发送短离散帧,则可能需要考虑使用message buffer而不是流缓冲区。
是,您可以使用互斥锁。
如果从多个任务发送,则主要要考虑的是当流缓冲区变满时会发生什么。如果您使用的是不同的FreeRTOS对象(而不是消息缓冲区,而是在流缓冲区上构建消息缓冲区),则试图写入已满对象的同一实例的多个任务将在尝试写入该对象时全部阻塞,并在对象中的空间可用时自动取消阻止-优先级最高的等待任务将首先被取消阻止,无论任务进入阻止状态的顺序如何。但是,使用流/消息缓冲区,您只能阻止一个试图写入完整缓冲区的任务-如果该缓冲区受静音保护,则所有其他任务都将在互斥体上阻塞。这可能意味着低优先级任务在流/消息缓冲区中被阻止,而高优先级任务在互斥体上被阻止-一种优先级倒置。]