Проблема наследования приоритетов мьютекса в 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 описывается как «упрощенный»,