2017-05-12 98 views
0

我在使用FreeRTOS二进制互斥锁时遇到了一些问题。在我的应用程序中,有多个具有相同优先级的线程(任务),其中两个对mutex采取和mutex释放中的文件I/O函数的访问。FreeRTOS具有相同优先级的互斥锁多任务

取决于某些时机,一个任务正在对另一个做饥饿。那可能吗?

FreeRTOS考虑到等待资源的任务有多少时间?

谢谢

+0

为什么要在临界区内进行文件I/O操作?这听起来像个坏主意。 –

+0

是多线程安全的。 – jabella

+0

还有其他方法可以线程安全。避免饥饿的最好方法是让互斥体尽可能小:不要做任何超过几个CPU周期的事情,并且不要做任何可能阻塞调用方的事情(例如,不要做文件I/O)。保持I/O线程安全的最好方法是只让一个线程访问任何特定的设备。我不知道你的程序与哪个存储设备对话,但它可能只有一个“端口”或“接口”,所以没有性能的理由让多个线程对话。这只是你选择如何组织你的程序的问题。 –

回答

3

您是否在多任务中使用紧密循环中的互斥锁?如果是这样,那么为什么一个任务可能会持续比您想象的时间更长的逻辑原因。如果任务A和B具有相同的优先级,则A持有该互斥体并且B正在等待该互斥体,则当A向互斥体返回时不会发生上下文切换,因为B具有与A相同的优先级(它会发生if B具有更高的优先级,但如果任务切换发生在同等优先级的任务上,则会违反调度算法和风险任务颠簸)。在那里,如果A在一个循环中,则将该互斥量返回,然后立即再次获取该互斥量,每当B尝试获取该互斥量时,就会发现A仍然保持该互斥量,因此,如果B也处于循环中,它将阻止再次在互斥体上。这种情况很容易解决 - 但建议您阅读免费提供的书中描述这一章的章节:http://www.freertos.org/Documentation/RTOS_book.html

+0

是的,你是对的。这是SD卡已满并且重试尝试做出您描述的场景的情况。我在重试时延迟了1毫秒。 de mutex释放后的taskYield也可以解决这个问题,但在我看来,延迟更为清晰。这种行为在操作系统上是否正常?我在想当一个互斥调用被调用时,操作系统会检查哪个任务正在等待更多时间。 – jabella