【问题标题】:FreeRTOS mutex priority inheritance problem if changing priority of task如果更改任务的优先级,FreeRTOS 互斥优先级继承问题
【发布时间】:2019-04-13 02:34:11
【问题描述】:

这是我不确定是否会出现问题的场景。

Foo()
{
TakeMutex()
//some critical code
GiveMutex()
}

Task A    priority 5
Task B    priority 1

TaskB{ Foo() }
TaskA{ Foo() }

现在在其他一些任务中,它可能会改变任务 A 和 B 的优先级。 假设任务 B 调用 Foo 并获取互斥锁。现在,当 B 拥有互斥锁时,任务 A 调用 foo 并尝试获取互斥锁。由于互斥体的优先级继承,任务 B 现在将成为任务 A 的优先级,即 5。

Task A    priority 5
Task B    priority 5 inherited

Now at this moment, some other task attempts to change the priority of Task
B to 8 using vTaskPrioritySet(). 

Task A    priority 5
Task B    priority 8 the set value if even? or does it stay 5 returning 8? 

问题是,在任务 B 放开互斥锁后,它会返回什么优先级?它会回到原来的优先级 1 还是保持其设定值。如果相反的情况是任务 A 被更改为更低或更高的优先级值呢?这种情况是否有任何排列会导致意外行为?

【问题讨论】:

  • 一个我没想过的有趣问题,也适用于 Linux。

标签: mutex freertos priority-inversion


【解决方案1】:

大多数 RTOS 实现都没有完整的互斥优先级继承实现。例如。引用FreeRTOS - Priority inheritance proposal

FreeRTOS 优先级继承机制被描述为“简化”,

【讨论】:

    【解决方案2】:

    freeRTOS 中优先级继承的目标是尽量减少优先级倒置的影响,而不是完全解决它们。这是实现复杂性、性能损失等之间的平衡。

    回答你的问题“问题是,任务B放开互斥锁后,它会回到什么优先级?”,释放互斥锁后它会恢复到原来的优先级。抢占可以而且很可能在此操作期间发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 2015-05-31
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多