Счетные семафоры - переменные типа unsigned char, unsigned int или unsigned long (в зависимости от установки константы OS_CSEM_SIZE в OSAcfg.h). Для того чтобы использовать счетные семафоры, в OSAcfg.h нужно определить константу OS_ENABLE_CSEM.
В программе счетный семафор определяется как переменная:
OST_CSEM mycsem;
Функционально счетные семафоры отличаются от бинарных тем, что могут принимать любое значение в диапазоне от 0 до максимального значения, допустимого типом семафора (255, 65535, 4294967295).
Перед работой со счетным семафором, его необходимо создать сервисом OS_Csem_Create. После создания семафор имеет нулевое значение. Задача, ожидающая семафор, будет находиться в режиме ожидания до тех пор, пока семафор не станет ненулевым. Как только задача дождется этого события, она переходит в состояние готовности и при получении управления вычитает из семафора 1.
Значение семафора может быть изменено одним из сервисов установки значения. Следует обратить внимание на то, что эти сервисы делятся на 2 подгруппы: обычные (можно использовать только вне прерываний) и для работы в прерывании. Для того, чтобы пользоваться счетными семафорами внутри прерываний, в файле OSAcfg.h нужно определить константу OS_ENABLE_INT
Отдельно можно выделить сервис OS_Csem_Signal. Этот сервис увеличивает счетный семафор на 1. Но если на момент вызова сервиса семафор уже имеет максимально допустимое значение, то установится флаг bEventError (проверяется сервисом OS_IsEventError), а семафор останется неизменным.
Сервис | Аргументы | Описание | Свойства |
---|---|---|---|
Создание | |||
OS_Csem_Create | (csem) | Подготавливает счетный семафор к работе (обнуляет его) | |
Управление | |||
OS_Csem_Signal | (csem) | Увеличивает значение семафора на 1 (с ожиданием при переполнении) | |
OS_Csem_Signal_Now | (csem) | Увеличивает значение семафора на 1 (без ожидания при переполнении). | |
OS_Csem_Set | (csem) | Устанавливаем счетный семафор в 1. | |
OS_Csem_SetValue | (csem, value) | Устанавливаем счетный семафор в конкретное значение value. | |
OS_Csem_Reset | (csem) | Обнуляем счетный семафор | |
Проверка | |||
OS_Csem_Accept | (csem) | Принимаем счетный семафор (уменьшаем его на 1). | |
bool OS_Csem_Check | (csem) | Смотрим, установлен ли семафор (д.б. != 0) | |
Ожидание | |||
OS_Csem_Wait | (csem) | Ожидаем установки семафора в ненулевое значение. Уменьшает значение семафора на 1. | |
OS_Csem_Wait_TO | (csem, timeout) | Ожидаем установки семафора с таймаутом. |