Available Languages?:

OSA : Счетные семафоры

Введение

Счетные семафоры - переменные типа unsigned char, unsigned int или unsigned long (в зависимости от установки константы OS_CSEM_SIZE в OSAcfg.h). Для того чтобы использовать счетные семафоры, в OSAcfg.h нужно определить константу OS_ENABLE_CSEM.

В программе счетный семафор определяется как переменная:

OST_CSEM  mycsem;

Для HT-PICC16 счетные семафоры можно размещать только в банках bank0 и bank1.

Функционально счетные семафоры отличаются от бинарных тем, что могут принимать любое значение в диапазоне от 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 (без ожидания при переполнении). Есть расширенный сервис с суффиксом _I для работы в прерывании
OS_Csem_Set (csem) Устанавливаем счетный семафор в 1. Есть расширенный сервис с суффиксом _I для работы в прерывании
OS_Csem_SetValue (csem, value) Устанавливаем счетный семафор в конкретное значение value. Есть расширенный сервис с суффиксом _I для работы в прерывании
OS_Csem_Reset (csem) Обнуляем счетный семафор Есть расширенный сервис с суффиксом _I для работы в прерывании
Проверка
OS_Csem_Accept (csem) Принимаем счетный семафор (уменьшаем его на 1). Есть расширенный сервис с суффиксом _I для работы в прерывании
bool
OS_Csem_Check
(csem) Смотрим, установлен ли семафор (д.б. != 0) Есть расширенный сервис с суффиксом _I для работы в прерывании
Ожидание
OS_Csem_Wait (csem) Ожидаем установки семафора в ненулевое значение. Уменьшает значение семафора на 1. Разрешен вызов только в контексте задачиПереключает контекст
OS_Csem_Wait_TO (csem, timeout) Ожидаем установки семафора с таймаутом. Разрешен вызов только в контексте задачиПереключает контекстИспользует системный таймер
 
osa/ref/services/counting_semaphores.txt · Последние изменения: 07.10.2010 13:54 (внешнее изменение)
 
Creative Commons License Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki