这是我不确定会出现问题的情况。
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更改为较低或较高的优先级值,那该怎么办?这种情况下是否存在任何可能引起意外行为的变化?
答案 0 :(得分:0)
大部分 RTOS 实现都没有完整的互斥优先级继承实现。例如。引用自 FreeRTOS - Priority inheritance proposal
<块引用>FreeRTOS 优先级继承机制被描述为“简化”,
答案 1 :(得分:0)
freeRTOS 中优先级继承的目标是最小化优先级反转的影响,而不是完全解决它们。这是实现复杂性、性能损失等之间的平衡。
回答你的问题“问题是,任务B释放了互斥锁后,它会回到什么优先级?”,释放互斥锁后它会回到原来的优先级。抢占很可能发生在此操作期间。