You are here

Рекурсивные мьютексы во FreeRTOS

Source: https://www.freertos.org/RTOS-Recursive-Mutexes.html

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


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

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

Описание

Рекурсивный мьютекс может быть повторно взят владельцем. Мьютекс не вернётся снова в доступное состояние, пока владелец не вызовет xSemaphoreGiveRecursive() для каждого выполненного запроса xSemaphoreTakeRecursive(). Например, если задача выполнила взятие некоторого мьютекса 5 раз, то этот мьютекс не будет доступен другим задачам до тех пор, пока он не будет ровно 5 раз выдан обратно.

Этот тип семафора использует механизм наследования приоритетов, поэтому задача, взявшая мьютекс, обязательно должна вернуть его, если он больше не требуется.

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

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

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

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

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

Hobby's category: