【问题标题】:FreeRTOS Mutex multiple task with same priorityFreeRTOS Mutex 具有相同优先级的多个任务
【发布时间】:2017-05-12 11:31:01
【问题描述】:

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

根据某些时间安排,一项任务对另一项任务造成饥饿。这可能吗?

FreeRTOS 会考虑任务等待资源的时间?

谢谢

【问题讨论】:

  • 为什么要在临界区进行文件 I/O?这听起来是个坏主意。
  • 多线程安全。
  • 还有其他方法可以保证线程安全。避免饥饿的最好方法是让你的互斥锁尽可能小:不要做任何需要超过几个 CPU 周期的事情,不要做任何可能阻塞调用者的事情(例如, 不要做文件 I/O)。保持 I/O 线程安全的最好方法是只让一个线程访问任何特定设备。我不知道您的程序与哪个存储设备通信,但它可能只有一个“端口”或“接口”,因此没有性能理由让多个线程与之通信。这只是您选择如何组织程序的问题。
  • 您可以随时使用 taskYIELD 强制上下文切换。

标签: multithreading freertos stm32f4


【解决方案1】:

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

【讨论】:

  • 是的,你是对的。这是SD卡已满并且重试尝试造成您描述的场景的情况。我在重试时延迟 1 毫秒来解决这个问题。 de mutex 发布后的 taskYield 也将解决问题,但在我的情况下,我认为延迟更清晰。这种行为在操作系统上正常吗?我在想,当调用 mutex take 时,操作系统会检查哪个任务正在等待更多时间。
  • @jabella 你是对的,如果两个任务的优先级相同,那么等待时间最长的任务应该被安排在下一个。为此,请检查配置文件中的设置 configUSETIMESLICINGconfigUSE_PREEMPTION 。这里有更多信息freertos.org/FreeRTOS_Support_Forum_Archive/May_2017/…
猜你喜欢
  • 2019-08-15
  • 2019-09-23
  • 2010-09-09
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多