如果更改任务优先级,则FreeRTOS互斥体优先级继承问题

时间:2019-04-13 02:34:12

标签: mutex freertos priority-inversion

这是我不确定会出现问题的情况。

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更改为较低或较高的优先级值,那该怎么办?这种情况下是否存在任何可能引起意外行为的变化?

2 个答案:

答案 0 :(得分:0)

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

<块引用>

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

答案 1 :(得分:0)

freeRTOS 中优先级继承的目标是最小化优先级反转的影响,而不是完全解决它们。这是实现复杂性、性能损失等之间的平衡。

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