xTaskNotifyGive / xTaskNotifyGiveIndexed
[ RTOS任务通知 API ]
task.h
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
BaseType_t xTaskNotifyGiveIndexed( TaskHandle_t xTaskToNotify,
UBaseType_t uxIndexToNotify );
每个任务都有一组“任务通知” (或仅“通知” ) ,每个
通知都包含状态和一个 32 位值。 直达任务通知是直接发送至任务的事件,
可以取消阻塞接收任务,并
可以选择通过多种方式更新接收任务的某个通知值。
例如,通知可覆盖接收任务的通知值中的一个,或仅设置
更多位。
当任务通知
用作轻量级且更快的二进制或计数信号量
替代方案时,可以使用宏 xTaskNotifyGive ()。
FreeRTOS 信号用通过使用 xSemaphoreGive () API 函数给出,而 xTaskNotifyGive ()
与其等效,使用接收 RTOS 任务的一个通知值代替信号量。
xTaskNotifyGive () 和 xTaskNotifyGiveIndexed () 是等效宏——唯一的区别是
xTaskNotifyGiveIndexed () 可以在始终在数组内任何任务通知上操作
,而 xTaskNotifyGive () 始终在数组索引 0 处的任务通知上运行。
当任务通知值用作二进制或等效计数信号量时,
则被通知的任务应等待
使用 ulTaskNotifyTake() API
函数的通知,而不是 xTaskNotifyWait()
API 函数。
注意: 数组中每个通知都独立运行——任务一次只能阻止数组中的一个通知,并且不会被发送到任何其他数组索引的通知取消阻止。
xTaskNotifyGive () 不能从中断服务例程调用。 使用
vTaskNotifyGiveFromISR() 代替。
configUSE_TASK_NOTIFICATIONS
必须在 FreeRTOSConfig.h 中设置为 1(或保留为未定义)才能使用这些宏。
常量
configTASK_NOTIFICATION_ARRAY_ENTRIES 设置
任务通知的每个任务数组中的索引数量。
向后兼容性信息:
在 FreeRTOS V10.4.0 之前,每个任务有一个单一的“通知值”,且
所有任务通知 API 函数都在该值上运行。用通知值的数组
更换单个通知值需要
新的 API 函数集,该函数集应能在数组内处理
。 xTaskNotifyGive () 是原始 API 函数,并且
通过始终在数组内索引 0 处的通知值上运行
来保持向后兼容。调用 xTaskNotifyGive () 等于调用
xTaskNotifyGiveIndexed (),其中 uxIndexToNotify 参数设置为 0。
-
参数:
-
-
返回:
-
xTaskNotifyGiveIndexed () 是用 eAction 参数调用 xTaskNotifyIndexed() 的宏,
eAction 参数设置为 eIncrement,因此所有调用都返回 pdPASS。
用法示例:
[更多示例来自主 RTOS 任务通知页面]
/* Prototypes of the two tasks created by main(). */
static void prvTask1( void *pvParameters );
static void prvTask2( void *pvParameters );
/* Handles for the tasks create by main(). */
static TaskHandle_t xTask1 = NULL, xTask2 = NULL;
/* Create two tasks that send notifications back and forth to each other,
then start the RTOS scheduler. */
void main( void )
{
xTaskCreate( prvTask1, "Task1", 200, NULL, tskIDLE_PRIORITY, &xTask1 );
xTaskCreate( prvTask2, "Task2", 200, NULL, tskIDLE_PRIORITY, &xTask2 );
vTaskStartScheduler();
}
/*-----------------------------------------------------------*/
/* prvTask1() uses the 'indexed' version of the API. */
static void prvTask1( void *pvParameters )
{
for( ;; )
{
/* Send notification to prvTask2(), bringing it out of the
Blocked state. */
xTaskNotifyGiveIndexed( xTask2, 0 );
/* Block to wait for prvTask2() to notify this task. */
ulTaskNotifyTakeIndexed( 0, pdTRUE, portMAX_DELAY );
}
}
/*-----------------------------------------------------------*/
/* prvTask2() uses the original version of the API (without the
'Indexed'). */
static void prvTask2( void *pvParameters )
{
for( ;; )
{
/* Block to wait for prvTask1() to notify this task. */
ulTaskNotifyTake( pdTRUE, portMAX_DELAY );
/* Send a notification to prvTask1(), bringing it out of the
Blocked state. */
xTaskNotifyGive( xTask1 );
}
}
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.