Компоненты и технологии • №2 '2011 компоненты


Создание двоичного семафора



Pdf көрінісі
бет61/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   57   58   59   60   61   62   63   64   ...   129
Kurniz

Создание двоичного семафора
Семафор должен быть явно создан перед 
первым его использованием. 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 — означает, что семафор недо-
ступен (никто его не отдал). Если опре-
делено время тайм-аута (параметр 


Достарыңызбен бөлісу:
1   ...   57   58   59   60   61   62   63   64   ...   129




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет