Source: https://freertos.org/FreeRTOS-Event-Groups.html
Перевод может содержать ошибки. Читайте первоисточник.
Пара моментов мне не совсем понятна, поэтому требуются уточнения.
[Межзадачное взаимодействие и синхронизация]
Начиная с версии FreeRTOS V8.0.0 |
Оглавление страницы:
Event Bits в оригинальной документации часто упоминаются как Event Flags. Мы будем переводить это как флаги событий или просто как флаги. По крайней мере до тех пор, пока в контексте FreeRTOS не появится других значений для этого слова. Флаги используются для того, чтобы указать, имело место некое событие или нет. Например, приложение может:
Группа флагов это некое множество флагов. Флаги внутри группы выбираются по индексу (номеру флага) (номеру бита?). Приведённый выше пример можно переписать следующим образом:
Для групп флагов определён тип данных EventGroupHandle_t.
Количество флагов в группе может быть не больше 8, если configUSE_16_BIT_TICKS == 1, либо не больше 24, если configUSE_16_BIT_TICKS == 0. Зависимость от configUSE_16_BIT_TICKS связана с тем, что тип данных используется в used for thread local storage in the internal implementation of tasks.
Все флаги в группе хранятся в одной переменной, имеющей тип EventBits_t. Флаг 0 хранится в разряде 0, бит 1 в разряде 1 и т.д.
Рисунок ниже иллюстрирует 24-битную группу флагов, которая использует три бита для хранения трёх флагов из примера выше. В данном случае флаг 2 установлен, два других сброшены.
An event group containing 24-event bits, only three of which are in use
Имеющиеся функции API для работы с группами флагов позволяют, среди прочего, устанавливать (set) один или несколько флагов в группе, сбрасывать (clear) один или несколько флагов в группе, и чтобы не расходовать процессорное время, дожидаться (pend) в заблокированном состоянии установки одного или нескольких флагов в группе флагов.
Группа флагов также может быть использована для синхронизации (synchronise) задач, создавая то, что обозначается термином задача "рандеву" (task 'rendezvous'). Точка синхронизации это место в коде приложения, где задача будет находиться в заблокированном состоянии (т.е. не расходовать процессорное время), пока все другие задачи, участвующие в синхронизации, не достигнут соответствущих своих точек синхронизации.
Вот две главные проблемы, которые необходимо решить в ОСРВ для того, чтобы реализовать группы флагов:
Реализация группы флагов вызовет "гонки" в приложении, если:
The FreeRTOS event groups implementation removes the potential for race conditions by including built in intelligence to ensure setting, testing and clearing of bits appears atomic. Thread local storage and careful use of API function return values make this possible.
Концепция группы флагов подразумевает неопределённые состояния, потому что неизвестно, сколько задач заблокировано на группе событий, и, следовательно, неизвестно, сколько ещё условий должно быть проверено или задач разблокировано, когда флаг будет установлен.
Стандарты качества не позволяют выполнять неопределённые действия, пока прерывания запрещены, или изнутри обработчиков прерываний. Чтобы убедиться, что эти строгие стандарты качества не нарушены, когда флаг установлен, нужно:
Фрагменты кода приведены в описании функций API, а более полный пример использования находится в файле EventGroupsDemo.c из комплекта поставки (исходный файл находится в каталоге FreeRTOS/Demo/Common/Minimal распакованного дистрибутива FreeRTOS download).