FreeRTOS 互斥优先级继承问题(如果更改任务的优先级)



这是我不确定会不会有问题的场景。

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 更改为较低或较高的优先级值,该怎么办?此方案是否有任何排列会导致意外行为?

大多数RTOS实现都没有完成互斥锁优先级继承实现。 例如,引用自由实时操作系统 - 优先继承提案

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

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

回答您的问题"问题是,任务 B 放弃互斥锁后,它将返回到什么优先级?",它将在释放互斥锁后返回到其原始优先级。抢占可能并且很可能在此操作期间发生。

最新更新