You are here

Task Notifications - Уведомления

Source: https://www.freertos.org/RTOS-task-notifications.html

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


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

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

Описание

У каждой задачи RTOS есть 32-битное поле уведомления (notification value). Уведомление задаче RTOS - это событие, посланное непосредственно в задачу, которое может разблокировать задачу-получатель и дополнительно обновить значение в поле уведомления задачи-получателя.

Существует несколько вариантов обновления значения в поле уведомления:

  • Установка значения в поле уведомления задачи-получателя без перезаписи предыдущего значения.
  • Перезапись значения в поле уведомления задачи-получателя.
  • Установка одного или нескольких бит в поле уведомления задачи-получателя.
  • Инкремент значения в поле уведомления задачи-получателя.

Эта гибкость позволяет использовать уведомления, там где ранее было бы необходимо создать отдельную очередь, бинарный семафор, счётный семафор или группу событий. Разблокировка задачи RTOS с прямым уведомлением на 45% быстрее 1) и использует меньше ОЗУ, чем разблокировка задачи с помощью бинарного семафора.

Уведомления высылаются вызовом функций API xTaskNotify() и xTaskNotifyGive() (и их вариантами для вызова из прерываний), и остаются ожидающими, пока задача-получатель не прочитает их вызовом функций API xTaskNotifyWait() или ulTaskNotifyTake(). Если в момент получения уведомления задача-получатель находилась в заблокированном состоянии и ожидала уведомления, то задача сразу же будет выведена из заблокированного состояния, а само уведомление будет очищено.

Функционал уведомлений по-умолчанию активирован, но может быть исключён из сборки проекта (это позволит сэкономить 8 байт ОЗУ на каждой задаче). Для исключения необходимо задать configUSE_TASK_NOTIFICATIONS = 0 в файле FreeRTOSConfig.h.

Преимущества и ограничения использования

У уведомлений есть преимущества в скорости и объёме используемого ОЗУ перед другими функциями FreeRTOS, которые могут быть использованы, чтобы реализовать аналогичный функционал. Как и следовал ожидать, эти преимущества требуют некоторых ограничений при использовании:

  1. Уведомления могут использоваться, когда есть только одна задача, которая может быть получателем события. Но это условие соблюдается в большинстве реальных приложений.
  2. В случае использования уведомлений вместо очереди следует учитывать то, что задача-получатель может находиться в заблокированном состоянии (т.е. не использовать времяпроцессора), а задача-отправитель не может ждать завершения отправки в заблокированном состоянии, если отправка не может быть выполнена немедленно.

Использование и примеры

Соответствующий функционал API разработан так, чтобы использовать уведомления в качестве более быстрой и лёгковесной альтернативы бинарным и счётным семафорам, группам событий и, в некоторых случаях, очередям (referred to in the documentation as a mailbox as the queue length must equal 1). Ссылки на страницы документации, демонстрирующие, как это может быть сделано, приведены ниже:

Связанные страницы:

Примечания:

1) При измерениях использовалась реализация бинарного семафора из версии FreeRTOS V8.1.2, скомпилированная GCC с ключом оптимизации -О2 и без определения функции configAssert(). 35%-е улучшение также может быть получено при использовании бинарных семафоров в версии FreeRTOS V8.2.0 и выше.
 

TypeOfContent: 
Hobby's category: