You are here

Бинарные семафоры во FreeRTOS

Source: https://www.freertos.org/Embedded-RTOS-Binary-Semaphores.html

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


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

[See also Blocking on Multiple RTOS Objects]

Описание

Бинарные семафоры используются и для взаимного исключения, и для синхронизации.

Бинарные семафоры и мьютексы очень похожи, но имеют некоторые тонкие различия: мьютексы включаеют механизм наследования приоритетов, а бинарные семафоры - нет. Это делает бинарные семафоры лучшим выбором для синхронизации (между задачами или между задачами и прерываниями), иа мьютексы лучший выбор для реализации простого взаимного исключения. Описание того, как мьютекс может использовать механизм взаимного исключения, в равной степени относится и к бинарным семафорам. Этот подраздел описывает только использование бинарных семафоров для синхронизации.

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

Бинарный семафор в FreeRTOS фактически является очередью с одним элементом. Следовательно очередь может быть либо пуста, либо полна (т.е. реализует бинарный семафор). Для задач и прерываний не имеет значения, что именно содержит очередь - важно только пуста она или полна. Этот механизм может использоваться, например, для синхронизации задачи и прерывания.

Рассмотрим случай, когда задача используется для обслуживания периферийного устройства. Циклический опрос периферийного устройства будет впустую расходовать процессорное время и мешать выполнению других задач. Поэтому желательно, чтобы задача большую часть времени находилась в заблокированном состоянии и переходила в запущенное состояние только тогда, когда ей действительно есть, что делать. Это достигается блокировкой задачи "на бинарном семафоре", т.е. при попытке "взять" ("take") семафор. А в обработчике прерывания от периферийного устройства в нужный момент "выдаётся" ("give") этот самый бинарный семафор. Задача всегда берёт (или "читает") семафор (т.е. читает его из очереди, чтобы сделать очередь пустой), но никогда не выдаёт его обратно. Обработчик прерывания всегда выдаёт семафор (пишет в очередь, чтобы сделать очередь полной), но никогда не берёт его. Исходный код, предоставленный на странице документации  по xSemaphoreGiveFromISR(), иллюстрирует сказанное выше. Также не забывайте про уведомления, на основе которых можно реализовать облегчённую альтернативу бинарным семафорам.

Приоритизация задач может использоваться для обеспечения своевременного обслуживания периферийных устройств - эффективного генерирования схемы «отложенного прерывания» (обратите внимание, что FreeRTOS также имеет встроенный механизм отложенного прерывания). Альтернативный подход заключается в использовании очереди вместо семафора. В этом случае обработчик прерывания забирает данные, связанные с событием в периферийном устройстве, и отправляет их в очередь для задачи. Когда данные появляются в очереди, задача разблокируется и получает данные из очереди, а затем выполняет необходимую обработку данных. Этот вариант работы с периферийным устройством позволяет обработчику прерывания выполняться максимально быстро, а вся обработка производится уже внутри задачи.

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

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


Использование семафора для синхронизации задачи с прерыванием. Прерывание только выдаёт семафор, а задача только берёт его.

 

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

Hobby's category: