You are here

Event Bits (or flags) and Event Groups - Флаги событий

Source: https://freertos.org/FreeRTOS-Event-Groups.html

Перевод может содержать ошибки. Читайте первоисточник.

Пара моментов мне не совсем понятна, поэтому требуются уточнения.


[Межзадачное взаимодействие и синхронизация]

Начиная с версии FreeRTOS V8.0.0

Оглавление страницы:

Event Bits (Event Flags) Биты событий (Флаги)

Event Bits в оригинальной документации часто упоминаются как Event Flags. Мы будем переводить это как флаги событий или просто как флаги. По крайней мере до тех пор, пока в контексте FreeRTOS не появится других значений для этого слова. Флаги используются для того, чтобы указать, имело место некое событие или нет. Например, приложение может:

  • Определить флаг, который будет означать, что "сообщение получено и готово к обработке", когда флаг установлен в 1, и "нет сообщений, ожидающих обработки", если флаг установлен в 0.
  • Определить флаг, который будет означать, что "приложение подготовило сообщение для отправки в сеть", когда флаг установлен в 1, и "нет сообщений, готовых к отправке в сеть", если флаг установлен в 0.
  • Определить флаг, который будет означать, что "пора отправлять heartbeat сообщение в сеть", когда флаг установлен в 1, и  and "ещё не время для отправки следующего heartbeat сообщения", если флаг установлен в 0.

Event Groups - Группы флагов

Группа флагов это некое множество флагов. Флаги внутри группы выбираются по индексу (номеру флага) (номеру бита?). Приведённый выше пример можно переписать следующим образом:

  • Флаг, означающий "сообщение получено и готово к обработке" будем адресовать индексом 0 внутри группы флагов.
  • Флаг, означающий "приложение подготовило сообщение для отправки в сеть" будем адресовать индексом 1 внутри группы флагов.
  • Флаг, означающий "пора отправлять heartbeat сообщение в сеть" будем адресовать индексом 2 внутри группы флагов..

 

Тип данных для флагов и групп флагов

Для групп флагов определён тип данных 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

 

Event Group RTOS API Functions - Функции API для работы с группами флагов

Имеющиеся функции API для работы с группами флагов позволяют, среди прочего, устанавливать (set) один или несколько флагов в группе, сбрасывать (clear) один или несколько флагов в группе, и чтобы не расходовать процессорное время, дожидаться (pend) в заблокированном состоянии установки одного или нескольких флагов в группе флагов.

Группа флагов также может быть использована для синхронизации (synchronise) задач, создавая то, что обозначается термином задача "рандеву" (task 'rendezvous'). Точка синхронизации это место в коде приложения, где задача будет находиться в заблокированном состоянии (т.е. не расходовать процессорное время), пока все другие задачи, участвующие в синхронизации, не достигнут соответствущих своих точек синхронизации.

The Challenges an RTOS Must Overcome When Implementing Event Groups - Проблемы, которые ОСРВ должна преодолеть, когда добавляется поддержка флагов

Вот две главные проблемы, которые необходимо решить в ОСРВ для того, чтобы реализовать группы флагов:

  1. Предупредить возникновение "гонок" в пользовательском приложении:

    Реализация группы флагов вызовет "гонки" в приложении, если:

    • Не ясно, кто отвечает за сброс отдельных флагов.
    • Не ясно, когда флаг должен быть сброшен.
    • Не ясно, не был ли установлен или сброшен флаг в то время, когда задача выходила из функции API, в которая проверялось значени флага (это могло произойти, если другая задача или прерывание с тех пор изменили значение бита).

    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.

  2. Предотвратить неопределённые состояния:

    Концепция группы флагов подразумевает неопределённые состояния, потому что неизвестно, сколько задач заблокировано на группе событий, и, следовательно, неизвестно, сколько ещё условий должно быть проверено или задач разблокировано, когда флаг будет установлен.

    Стандарты качества не позволяют выполнять неопределённые действия, пока прерывания запрещены, или изнутри обработчиков прерываний. Чтобы убедиться, что эти строгие стандарты качества не нарушены, когда флаг установлен, нужно:

      • Использовать механизм блокировки шедулера RTOS, чтобы гарантировать, что прерывания остаются разрешёнными, когда флаг устанавливается из задачи RTOS.
      • Использовать механизм централизованной отсроченной обработки прерываний для отсрочки действий по установке флага задаче, когда предпринята попытка установки флага из обработчика прерывания.

Примеры

Фрагменты кода приведены в описании функций  API, а более полный пример использования находится в файле EventGroupsDemo.c из комплекта поставки (исходный файл находится в каталоге FreeRTOS/Demo/Common/Minimal распакованного дистрибутива FreeRTOS download).


 

Hobby's category: