Старт ARM. RTOS часть 5-ая. Мьютексы.

Старт ARM. RTOS часть 1-ая. STM32F4 и SAM3N.
Старт ARM. RTOS часть 2-ая.
Старт ARM. RTOS часть 3-ая. Очереди.
Старт ARM. RTOS часть 4-ая. Семафоры.

Всем привет, продолжаем дальше на практике изучать FreeRTOS на базе STM32F429i – DISCO. Сегодня на повестки дня мьютексы.

Мьютекс (англ. mutex, от mutual exclusion — «взаимное исключение») — одноместный семафор, служащий в программировании для синхронизации одновременно выполняющихся потоков.
Мьютексы — это один из вариантов семафорных механизмов для организации взаимного исключения. Они реализованы во многих ОС, их основное назначение — организация взаимного исключения для потоков из одного и того же или из разных процессов.

Мьютексы — это простейшие двоичные семафоры, которые могут находиться в одном из двух состояний — отмеченном или неотмеченном (открыт и закрыт соответственно). Когда какой-либо поток, принадлежащий любому процессу, становится владельцем объекта mutex, последний переводится в неотмеченное состояние. Если задача освобождает мьютекс, его состояние становится отмеченным.

Задача мьютекса — защита объекта от доступа к нему других потоков, отличных от того, который завладел мьютексом. В каждый конкретный момент только один поток может владеть объектом, защищённым мьютексом. Если другому потоку будет нужен доступ к переменной, защищённой мьютексом, то этот поток засыпает до тех пор, пока мьютекс не будет освобождён.
Цель использования мьютексов — защита данных от повреждения в результате асинхронных изменений (состояние гонки), однако могут порождаться другие проблемы — такие, как взаимная блокировка (клинч).

Мьютекс — одна из реализаций спинлока.

Мьютекс отличается от семафора общего вида тем, что только владеющий им поток может его освободить, т.е. перевести в отмеченное состояние.

Во FreeRTOS мьютексы – это механизм управления, функциями которые взаимодействую с железом, то есть аппаратным ресурсом. Семафоры – это механизм управления программными функциями. Очереди – это механизм управления памятью. Все эти штуки организованы как очереди, в принципе одно и тоже, только назвали по-разному, дали каждому свой ярлык. Задача у нас такая, есть один UART и из двух задач через этот интерфейс передаем данные, раньше мы это делали через очереди, что бы защитить от кваказябры, сегодня тоже самое только через мьютекс.

Пример реализации мьютекса

Пример реализации рекурсивного мьютекса.

Их основное отличие от обычных мьютексов заключается в том, что они корректно работают при вложенных операциях захвата и освобождения мьютекса. Вложенные операции захвата/освобождения мьютекса допускаются только в теле задачи-владельца мьютекса. Что значит, между взятием и освобождением мьютекса можно еще раз взять мьютекс и он корректно будет работать.

С мьютексами на сегодня все! В следующий раз разберем пример для сопрограмм. 🙂

Проект freeRTOS_mutex_1.7z
Проект freeRTOS_mutex_2.7z

Отправить ответ

Оставьте первый комментарий!

Уведомлять о
avatar
wpDiscuz