Проблема наследования приоритетов мьютекса в 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 была изменена на более низкий или более высокий приоритет. Есть ли какая-либо перестановка этого сценария, которая может вызвать неожиданное поведение?

2 ответа

Цель наследования приоритетов в freeRTOS - минимизировать эффекты инверсий приоритетов, а не полностью их решить. Это баланс между сложностью реализации, потерями производительности и т. Д.

Отвечая на ваш вопрос «Вопрос в том, что после того, как задача B отпустит мьютекс, к какому приоритету она вернется?», Она вернется к своему исходному приоритету после освобождения мьютекса. Упреждение может и, скорее всего, произойдет во время этой операции.

Большинство реализаций RTOS не имеют полной реализации наследования приоритета мьютекса. Например, цитата из FreeRTOS - Предложение о приоритетном наследовании.

Механизм наследования приоритетов FreeRTOS описывается как «упрощенный»,

Другие вопросы по тегам