2

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

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 更改为更低或更高的优先级值,那该怎么办。这种情况是否有任何排列会导致意外行为?

4

2 回答 2

0

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

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

于 2021-05-03T20:36:21.897 回答
0

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

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

于 2021-05-09T20:25:05.983 回答