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