Создание двоичного семафора
Семафор должен быть явно создан перед
первым его использованием. API-функция
vSemaphoreCreateBinary() служит для созда-
ния двоичного семафора.
void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore );
Единственным аргументом является де-
скриптор семафора, в него будет возвращен
дескриптор в случае успешного создания
семафора. Если семафор не создан по при-
чине отсутствия памяти, вернется значение
NULL. Так как vSemaphoreCreateBinary()
представляет собой макрос, то аргумент
xSemaphore следует передавать напрямую,
то есть нельзя использовать указатель на де-
скриптор и операцию переадресации.
Захват семафора
О с у щ е с т в л я е т с я A P I - ф у н к ц и е й
xSemaphoreTake() и может вызываться толь-
ко из задач. В классической терминологии
[1] соответствует функции P() или wait().
Чтобы задача смогла захватить семафор, он
должен быть отдан другой задачей или об-
работчиком прерывания. Все типы семафо-
ров за исключением рекурсивных (о них —
в следующей публикации) могут быть
захвачены с помощью xSemaphoreTake().
API-функцию xSemaphoreTake() нельзя вы-
зывать из обработчиков прерываний.
Прототип:
portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore,
portTickType xTicksToWait );
Назначение параметров и возвращаемое
значение:
xSemaphore
•
— дескриптор семафора.
Должен быть получен с помощью API-
функции создания семафора.
xTicksToWait
•
— максимальное количество
квантов времени, в течение которого за-
дача может пребывать в блокированном
состоянии, если семафор невозможно
захватить (семафор недоступен). Для
представления времени в миллисекундах
следует использовать макроопределение
portTICK_RATE_MS [2, КиТ № 4]). Задание
xTicksToWait равным 0 приведет к тому,
что задача не перейдет в блокированное
состояние, если семафор недоступен,
а продолжит свое выполнение сразу же.
Установка xTicksToWait равным константе
portMAX_DELAY приведет к тому, что вы-
хода из блокированного состояния по ис-
течении времени тайм-аута не произойдет.
Задача будет сколь угодно долго «ожидать»
возможности захватить семафор, пока та-
кая возможность не появится. Для этого
макроопределение INCLUDE_vTaskSuspend
в файле FreeRTOSConfig.h должно быть
равно «1».
Возвращаемое значение — возможны два
•
варианта:
– pdPASS — свидетельствует об успешном
захвате семафора. Если определено вре-
мя тайм-аута (параметр xTicksToWait
не равен 0), то возврат значения pdPASS
говорит о том, что семафор стал досту-
пен до истечения времени тайм-аута
и был успешно захвачен.
– pdFALSE — означает, что семафор недо-
ступен (никто его не отдал). Если опре-
делено время тайм-аута (параметр
Достарыңызбен бөлісу: |