You are here

Мьютексы во FreeRTOS

Source: https://www.freertos.org/Real-time-embedded-RTOS-mutexes.html

Перевод может содержать ошибки. Читайте первоисточник.


[Межзадачное взаимодействие и синхронизация]

[См. также Blocking on Multiple RTOS Objects]

Описание

Мьютексы - это бинарные семафоры, которые включают механизм наследования приоритетов. В то время, как бинарные семафоры являются лучшим выбором для синхронизации (между задачами, либо между задачами и прерываниями), мьютексы лучше всего подходят для реализации простого взаимного исключения. Отсюда и название: 'MUT'ual 'EX'clusion.

При использовании взаимного исключения мьютекс действует как токен, который служит для защиты ресурса. Когда задаче нужно получить доступ к ресурсу, то она сначала должна получить (взять, 'take') мьютекс. Когда задача завершает работу с ресурсом, она должна вернуть (выдать, 'take') токен обратно, предоставив другим задачам возможность получить доступ к тому же ресурсу.

Мьютексы используют те же функции API, что и семафоры, поэтому для них тоже можно задавать время блокировки. Время блокировки указывает количество тиков RTOS, в течение которых задача будет оставаться в заблокированном состоянии при попытке захватить мьютекс, если он не доступен сразу. Однако в отличие от бинарных семафоров мьютексы используют механизм наследования приоритетов. Это означает, что высокоприоритетная задача, заблокированная на ожидании мьютекса, который в данный момент удерживается низкоприоритетной задачей, временно поднимает приоритет низкоприоритетной задачи до уровня заблокированной высокоприоритетной задачи. Этот механизм предназначен для того, чтобы высокоприоритетная задача оставалась заблокированной на минимально возможное время, и при этом минимизировать "инверсию приоритетов", которая уже произошла.

Наследование приоритетов не позволяте полностью избавиться от инверсии приоритетов! Оно лишь позволяет минимизировать отрицательный эффект в некоторых ситуациях. Приложения с жёсткими требования к выполнению в реальном времени должны быть спроектированы таким образом, чтобы в первую очередь исключить возможность возникновения таких ситуаций.

Мьютексы не должны использоваться в прерываниях по следующим причинам:

  • Они используют механизм наследования приоритетов, который имеет смысл только если мьютекс выдаётся и берётся из задачи, а не из прерывания.
  • Прерывание не может переходить в заблокированное состояние для ожидания ресурсов, которые защищены мьютексом.

Использование мьютекса для защиты (разделения) доступа к общему ресурсу.



Документация и примеры использования

Список функций API для управления семафорами/мьютексами приведён в документации. Примеры их использования вы найдёте в файлах в каталоге FreeRTOS/Demo/Common/Minimal. Обратите внимание, что в прерываних допустимо использовать только те функции, которые имеют суффикс "FromISR".

В учебнике по FreeRTOS вы найдёте дополнительную информацию по очередям, бинарным семафорам, мьютексам, счётным семафорам и рекурсивным семафорам. Также там в демонстрационных проектах приведены простые примеры их использования.

Hobby's category: