1-xTaskNotifyGive / xTaskNotifyGiveIndexed
1task.h 2 3BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); 4 5BaseType_t xTaskNotifyGiveIndexed( TaskHandle_t xTaskToNotify, 6UBaseType_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。
1.1 参数:
xTaskToNotify 正被通知的 RTOS 任务的句柄,且该任务的通知值 正在递增。
要获取任务句柄,请使用 xTaskCreate() 创建任务并使用 pxCreatedTask 参数,或使用返回值创建任务 xTaskCreateStatic() 并存储该值,或在 xTaskGetHandle() 调用中使用任务的名称。
当前执行的 RTOS 任务的句柄通过以下方式 由 xTaskGetCurrentTaskHandle() API 函数返回。
uxIndexToNotify 目标任务通知值数组中的索引, 通知值将发送给该索引。
uxIndexToNotify必须小于 configTASK_NOTIFICATION_ARRAY_ENTRIES。xTaskNotifyGive () 没有此参数,并且总是向索引 0 发送通知。
1.2 Returns:
xTaskNotifyGiveIndexed () 是用 eAction 参数调用 xTaskNotifyIndexed() 的宏, eAction 参数设置为 eIncrement,因此所有调用都返回 pdPASS。
1.3 用法示例:
1/* main()创建的两个任务的原型。*/ 2static void prvTask1( void *pvParameters ); 3static void prvTask2( void *pvParameters ); 4 5/*main()创建的任务句柄。 */ 6static TaskHandle_t xTask1 = NULL, xTask2 = NULL; 7 8/* 创建两个相互来回发送通知的任务,然后启动RTOS调度器。 */ 9void main( void ) 10{ 11xTaskCreate( prvTask1, "Task1", 200, NULL, tskIDLE_PRIORITY, &xTask1 ); 12xTaskCreate( prvTask2, "Task2", 200, NULL, tskIDLE_PRIORITY, &xTask2 ); 13vTaskStartScheduler(); 14} 15/*-----------------------------------------------------------*/ 16 17/* prvTask1()使用API的“索引”版本。*/ 18static void prvTask1( void *pvParameters ) 19{ 20for( ;; ) 21{ 22/* 向prvTask2()发送通知,使其脱离阻塞状态。 */ 23xTaskNotifyGiveIndexed( xTask2, 0 ); 24 25/* 阻塞等待prvTask2()通知此任务。*/ 26ulTaskNotifyTakeIndexed( 0, pdTRUE, portMAX_DELAY ); 27} 28} 29/*-----------------------------------------------------------*/ 30 31/* prvTask2()使用API的原始版本(没有'Indexed')。 */ 32static void prvTask2( void *pvParameters ) 33{ 34for( ;; ) 35{ 36/* 阻塞等待prvTask1()通知此任务。 */ 37ulTaskNotifyTake( pdTRUE, portMAX_DELAY ); 38 39/* 向prvTask1()发送通知,使其脱离阻塞状态。*/ 40xTaskNotifyGive( xTask1 ); 41} 42}
2-vTaskNotifyGiveFromISR /
vTaskNotifyGiveIndexedFromISR
1task.h 2 3void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, 4BaseType_t *pxHigherPriorityTaskWoken ); 5 6void vTaskNotifyGiveIndexedFromISR( TaskHandle_t xTaskHandle, 7UBaseType_t uxIndexToNotify, 8BaseType_t *pxHigherPriorityTaskWoken );
可在中断服务程序 (ISR) 中使用的 xTaskNotifyGive() 和 xTaskNotifyGiveIndexed() 的版本。请参阅文档页面,以获取关于 API 函数 xTaskNotifyGive() 的 操作描述和必要的配置参数, 以及向后兼容性信息。
2.1参数:
xTaskToNotify 正被通知的 RTOS 任务的句柄,且该任务的通知值 正在递增。
要获取任务句柄,请使用 xTaskCreate() 创建任务并使用 pxCreatedTask 参数,或使用返回值创建任务 xTaskCreateStatic() 并存储该值,或在 xTaskGetHandle() 调用中使用任务的名称。
当前执行的 RTOS 任务的句柄通过以下方式 由 xTaskGetCurrentTaskHandle() API 函数返回。
uxIndexToNotify 目标任务通知值数组中的索引, 通知值将发送给该索引。uxIndexToNotify 必须小于 configTASK_NOTIFICATION_ARRAY_ENTRIES。xTaskNotifyGiveFromISR() 不具有此参数,并且始终 将通知发送到索引 0。
pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken 必须初始化为 0。
如果发送通知导致任务解除阻塞,并且被阻塞任务的优先级高于 当前运行的任务,vTaskNotifyGiveFromISR() 会将 *pxHigherPriorityTaskWoken 设 xTaskNotifyFromISR() 会将 *pxHigherPriorityTaskWoken 。
如果 vTaskNotifyGiveFromISR() 将此值设置为 pdTRUE , 则应在中断退出之前请求上下文切换 。
pxHigherPriorityTaskWoken 为可选参数,且可 设置为 NULL。
2.2 用法示例:
1/* 这是一个通用外设驱动程序中传输函数的例子。RTOS任务调用传输函数,然后在阻塞状态下等待(因此不使用CPU时间),直到它被通知传输完成。传输由DMA执行,DMA端中断用于通知任务。 */ 2 3static TaskHandle_t xTaskToNotify = NULL; 4 5/* 外设驱动的传输功能。 */ 6void StartTransmission( uint8_t *pcData, size_t xDataLength ) 7{ 8/* 此时,xTaskToNotify应该为NULL,因为没有正在进行的传输。如果需要,可以使用互斥来保护对外围设备的访问。 */ 9configASSERT( xTaskToNotify == NULL ); 10 11/* 存储调用任务的句柄。 */ 12xTaskToNotify = xTaskGetCurrentTaskHandle(); 13 14/*启动传输——传输完成时产生中断。*/ 15vStartTransmit( pcData, xDatalength ); 16} 17/*-----------------------------------------------------------*/ 18 19/* 结束中断传输 */ 20void vTransmitEndISR( void ) 21{ 22BaseType_t xHigherPriorityTaskWoken = pdFALSE; 23 24/*时xTaskToNotify不应该为NULL,因为传输正在进行中。*/ 25configASSERT( xTaskToNotify != NULL ); 26 27/*通知任务传输完成。*/ 28vTaskNotifyGiveIndexedFromISR( xTaskToNotify, 0, &xHigherPriorityTaskWoken ); 29 30/* 没有正在进行的传输,所以没有要通知的任务。 */ 31xTaskToNotify = NULL; 32 33/* 如果xhigherprioritytaskkoken现在被设置为pdTRUE,那么应该执行上下文切换,以确保中断直接返回到最高优先级的任务。用于此目的的宏依赖于正在使用的端口,可以称为portEND_SWITCHING_ISR()。 */ 34portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); 35} 36/*-----------------------------------------------------------*/ 37 38/* 启动传输的任务,然后进入阻塞状态(因此不消耗任何CPU时间),等待传输完成。*/ 39void vAFunctionCalledFromATask( uint8_t ucDataToTransmit, size_t xDataLength ) 40{ 41uint32_t ulNotificationValue; 42const TickType_t xMaxBlockTime = pdMS_TO_TICKS( 200 ); 43 44/* 通过调用上面所示的函数来启动传输。 */ 45StartTransmission( ucDataToTransmit, xDataLength ); 46 47/* 等待传输完成。 */ 48ulNotificationValue = ulTaskNotifyTakeIndexed( 0, pdFALSE, xMaxBlockTime ); 49 50if( ulNotificationValue == 1 ) 51{ 52/* 传输结束。 */ 53} 54else 55{ 56/* 对ulTaskNotifyTake()的调用超时。 */ 57} 58}
3-ulTaskNotifyTake / ulTaskNotifyTakeIndexed
1task.h 2 3uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, 4TickType_t xTicksToWait ); 5 6uint32_t ulTaskNotifyTakeIndexed( UBaseType_t uxIndexToWaitOn, 7BaseType_t xClearCountOnExit, 8TickType_t xTicksToWait );
每个任务都有一组“任务通知” (或仅“通知” ) ,每个 通知都包含状态和一个 32 位值。直达任务通知是直接发送至任务的事件, 可以取消接收任务的阻塞状态,还 可以选择通过多种方式更新接收任务的某个通知值。例如,通知可覆盖接收任务的通知值中的一个,或仅设置 接收任务的通知值中的一个或多个比特位。
ulTaskNotifyTake() 是一个宏,在任务通知 被用作更快、更轻的二进制 或计数信号量替代时使用。使用 xSemaphoreTake() API 函数获取 FreeRTOS 信号量,ulTaskNotifyTake() 是使用通知值代替信号量的等效宏。
ulTaskNotifyTake() 和 ulTaskNotifyTakeIndexed() 是等效的宏,它们唯一的区别 是 ulTaskNotifyTakeIndexed() 可以在数组内的任何任务通知上运行, 而 ulTaskNotifyTake() 始终在数组索引 0 处的任务通知上运行。
当任务使用通知值作为二进制或计数信号量时, 其他任务和中断应使用 xTaskNotifyGive() 宏,或 eAction 参数设置为 eIncrement 的 xTaskNotify() 函数 (二者等效)。
ulTaskNotifyTake() 可以在退出时清除任务的通知值为 0, 在这种情况下,通知值起到二进制信号量的作用;或在退出时递减任务的通知值,在这种情况下, 通知值更像是计数信号量。
RTOS 任务可以使用 ulTaskNotifyTake() [可选]进入阻塞状态以等待 任务的通知值。任务处于阻塞状态时 不消耗任何 CPU 时间。
注意:数组中每个通知都独立运行——在数组中的一个通知上一次只能阻塞一个任务,并且该任务不会被发送到任何其他数组索引处的通知取消阻塞。
然而当通知被挂起时,xTaskNotifyWait() 将返回, 当任务的通知值不为 0 时,ulTaskNotifyTake() 将返回, 并在返回之前递减任务的通知值。
configUSE_TASK_NOTIFICATIONS 必须在 FreeRTOSConfig.h 中设置为 1(或保留为未定义)才能使用这些宏。常量 configTASK_NOTIFICATION_ARRAY_ENTRIES 设置 任务通知的每个任务数组中的索引数量。
向后兼容性信息:
在 FreeRTOS V10.4.0 之前,每个任务有一个单一的“通知值”,且 所有任务通知 API 函数都在该值上运行。用通知值的数组 更换单个通知值需要 新的 API 函数集,该函数集应能在数组内处理 特定通知。ulTaskNotifyTake() 是原始 API 函数,并且 通过始终在数组内索引 0 处的通知值上运行保持 向后兼容。调用 ulTaskNotifyTake() 等于调用 ulTaskNotifyTakeIndexed(),其中 uxIndexToWaitOn 参数设置为 0。
3.1 参数:
uxIndexToWaitOn 调用任务的数组中通知值的索引, 调用任务将在该通知值上等待通知 变成非零。uxIndexToWaitOn 必须小于 configTASK_NOTIFICATION_ARRAY_ENTRIES。
xTaskNotifyTake() 没有此参数,总是在索引 0 处等待通知。
xClearCountOnExit 如果收到 RTOS 任务通知且 xClearCountOnExit 设置为 pdFALSE,则 RTOS 任务的通知值 在 ulTaskNotifyTake() 退出之前递减。这 等同于 通过成功调用 xSemaphoreTake() 而递减计数信号量的值。
如果收到 RTOS 任务通知且 xClearCountOnExit 设置为 pdTRUE,则 RTOS 任务的通知值 在 ulTaskNotifyTake() 退出之前重设为 0。这 等同于在成功调用 xSemaphoreTake() 后 将二进制信号量的值保留为 0 (或为空,或为“不可用” )。
xTicksToWait 在阻塞状态下等待接收通知的最长时间, 如果通知在 ulTaskNotifyTake() 被调用时 尚未挂起。
处于阻塞状态的 RTOS 任务不会消耗 任何 CPU 时间。
时间以 RTOS tick 周期为单位。宏 pdMS_TO_TICKS() 可以 将以毫秒为单位的时间 转换成以 tick 为单位的时间。
3.2 Returns:
被递减或清楚之前的任务通知值的值 (请参阅 xClearCountOnExit 的说明)。
3.3 用法示例:
1/*中断处理程序。中断处理程序不执行任何处理,而是解阻塞一个高优先级的任务,在这个任务中,产生中断的事件正在被处理。如果任务的优先级足够高,那么中断将直接返回到该任务(因此它将中断一个任务,但返回到另一个任务),因此处理将在时间上连续发生——就像所有的处理都在中断处理程序本身中完成一样。 */ 2void vANInterruptHandler( void ) 3{ 4BaseType_t xHigherPriorityTaskWoken; 5 6/* 中断清除 */ 7prvClearInterruptSource(); 8 9/*xhigherprioritytaskkoken必须初始化为pdFALSE。如果调用vTaskNotifyGiveFromISR()解除阻塞处理任务,并且处理任务的优先级高于当前运行任务的优先级,那么xhigherprioritytaskkoken将自动被设置为pdTRUE。 10*/ 11xHigherPriorityTaskWoken = pdFALSE; 12 13/*解除处理任务的阻塞,以便该任务可以执行中断所需的任何处理。xHandlingTask是任务的句柄,是在创建任务时获得的。 */ 14vTaskNotifyGiveIndexedFromISR( xHandlingTask, 0, &xHigherPriorityTaskWoken ); 15 16/* 如果xhigherprioritytaskkoken现在设置为pdTRUE,则强制上下文切换。用于完成此任务的宏依赖于端口,可以称为portEND_SWITCHING_ISR。 */ 17portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); 18} 19/*-----------------------------------------------------------*/ 20 21/*一个阻塞等待通知外设需要服务的任务,每次通知时处理外设中所有挂起的事件。*/ 22void vHandlingTask( void *pvParameters ) 23{ 24BaseType_t xEvent; 25 26for( ;; ) 27{ 28/*无限期地阻塞(没有超时,因此不需要检查函数的返回值)以等待通知。在这里,RTOS任务通知被用作二进制信号量,因此退出时通知值被清除为零。注意!真实的应用程序不应该无限期地阻塞,而是偶尔超时,以处理可能阻止中断发送更多通知的错误条件。 29 30*/ 31ulTaskNotifyTakeIndexed( 0, /*第0个通知*/ 32pdTRUE, /* 退出前清除通知值。*/ 33portMAX_DELAY ); /* 阻塞延时 */ 34 35/* RTOS任务通知被用作二进制(而不是计数)信号量,因此只有在外围设备中所有挂起的事件都处理完毕后才返回等待进一步的通知。 */ 36do 37{ 38xEvent = xQueryPeripheral(); 39 40if( xEvent != NO_MORE_EVENTS ) 41{ 42vProcessPeripheralEvent( xEvent ); 43} 44 45} while( xEvent != NO_MORE_EVENTS ); 46} 47}
4-xTaskNotify / xTaskNotifyIndexed
1task.h 2 3BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, 4uint32_t ulValue, 5eNotifyAction eAction ); 6 7BaseType_t xTaskNotifyIndexed( TaskHandle_t xTaskToNotify, 8UBaseType_t uxIndexToNotify, 9uint32_t ulValue, 10eNotifyAction eAction );
[如果你使用 RTOS 任务通知来实现二进制或计数 信号量类型行为,请使用更简单的 xTaskNotifyGive() API 函数,而不是 xTaskNotify()]
每个任务都有一个“任务通知”数组(或简称为“通知”),每个 通知都包含状态和一个 32 位值。直达任务通知是直接发送至任务的事件, 可以取消接收任务的阻塞状态,还 可以选择通过多种方式更新接收任务的某个通知值。例如,通知可覆写接收任务的某个通知值,或仅设置 接收任务的通知值中的一个或多个比特位。
xTaskNotify() 用于将事件 直接发送到 RTOS 任务并可能取消该任务的阻塞状态,还可选择 以下列方式更新接收任务的通知值:
将 32 位数字写入通知值
添加一个(递增)通知值
设置通知值中的一个或多个位
保持通知值不变
xTaskNotify() 和 xTaskNotifyIndexed() 是等效的函数 - 唯一的区别 是 xTaskNotifyIndexed() 可以对数组内的任何任务通知进行操作, 而 xTaskNotify() 始终对数组索引 0 处的任务通知进行操作。
不得从中断服务例程 (ISR) 调用此函数。使用 xTaskNotifyFromISR() 代替。
configUSE_TASK_NOTIFICATIONS 必须在 FreeRTOSConfig.h 中设置为 1(或保留为未定义)以使这些函数可用。常量 configTASK_NOTIFICATION_ARRAY_ENTRIES 设置 任务通知的每个任务数组中的索引数量。
向后兼容性信息:
在 FreeRTOS V10.4.0 之前,每个任务有一个单一的“通知值”,且 所有任务通知 API 函数都在该值上运行。用通知值的数组 更换单个通知值需要 新的 API 函数集,该函数集应能在数组内处理 数组中的特定通知。xTaskNotify() 是原始 API 函数,并且 通过始终对数组中索引 0 处的通知值进行操作来保持向后兼容 。调用 xTaskNotify() 相当于调用 xTaskNotifyIndexed(), 其 uxIndexToNotify 参数设置为 0。
4.1参数:
xTaskToNotify 正在通知的 RTOS 任务的句柄。这是目标任务。要获取任务句柄, xTaskCreate() 创建任务并使用 pxCreatedTask 参数,或使用返回值创建任务 xTaskCreateStatic() 并存储该值,或在 xTaskGetHandle() 调用中使用任务的名称。
当前执行的 RTOS 任务的句柄通过以下方式 由 xTaskGetCurrentTaskHandle() API 函数返回。
uxIndexToNotify 目标任务通知值数组中的索引, 通知值将发送给该索引。uxIndexToNotify 必须小于 configTASK_NOTIFICATION_ARRAY_ENTRIES。
xTaskNotify() 没有此参数,并且始终向索引 0 发送通知。
ulValue 用于更新目标任务的通知值。请参阅下面 eAction 参数的说明。
eAction 一种枚举类型,可以采用 下表中记录的值之一来执行相关操作。
4.2 Returns:
除 eAction 设置为 eSetValueWithoutOverwrite 且目标任务的通知值 因目标任务已有挂起的通知而无法更新之外, 在所有情况下均返回 pdPASS。
4.3 用法示例:
1/* 在xTask1Handle使用到的任务的第0个通知值中设置位8。*/ 2xTaskNotifyIndexed( xTask1Handle, 0, ( 1UL << 8UL ), eSetBits ); 3 4/* 向xTask2Handle引用的任务发送通知,可能会将任务从Blocked状态中移除,但不更新任务的通知值。*/ 5xTaskNotify( xTask2Handle, 0, eNoAction ); 6 7/* 将xTask3Handle引用的任务的通知值设置为0x50,即使任务没有读取它之前的通知值。 */ 8xTaskNotify( xTask3Handle, 0x50, eSetValueWithOverwrite ); 9 10/* 将xTask4Handle引用的任务的通知值设置为0xfff,但前提是这样做不会在任务获得通知值之前覆盖任务的现有通知值(通过调用xTaskNotifyWait()或ulTaskNotifyTake())。*/ 11if( xTaskNotify( xTask4Handle, 0xfff, eSetValueWithoutOverwrite ) == pdPASS ) 12{ 13/* 更新任务通知的值 */ 14} 15else 16{ 17/* 任务通知的值没有更新 */ 18}
5-xTaskNotifyAndQuery / xTaskNotifyAndQueryIndexed
1task.h 2 3BaseType_t xTaskNotifyAndQuery( TaskHandle_t xTaskToNotify, 4uint32_t ulValue, 5eNotifyAction eAction, 6uint32_t *pulPreviousNotifyValue ); 7 8BaseType_t xTaskNotifyAndQueryIndexed( TaskHandle_t xTaskToNotify, 9UBaseType_t uxIndexToNotify, 10uint32_t ulValue, 11eNotifyAction eAction, 12uint32_t *pulPreviousNotifyValue );
xTaskNotifyAndQueryIndexed() 执行的 操作与 xTaskNotifyIndexed() 相同, 还会在附加的 pulPreviousNotifyValue 参数中 返回目标任务的上一个通知值 (调用函数时的通知值,而不是函数返回时的通知值)。
xTaskNotifyAndQuery() 执行的 操作与 xTaskNotify() 相同, 同样,还会在附加的 pulPreviousNotifyValue 参数中 返回目标任务的上一个通知值 (调用函数时的通知值, 而不是函数返回时的通知值)。
不得从中断服务程序 (ISR) 调用此函数。使用xTaskNotifyAndQueryFromISR() 代替。
5.1 参数:
xTaskToNotify 正在通知的 RTOS 任务的句柄。这是目标任务。
要获取任务句柄, xTaskCreate() 创建任务并使用 pxCreatedTask 参数,或使用返回值创建任务 xTaskCreateStatic() 并存储该值,或在 xTaskGetHandle() 调用中使用任务的名称。
当前执行的 RTOS 任务的句柄通过以下方式 由 xTaskGetCurrentTaskHandle() API 函数返回。
uxIndexToNotify 目标任务通知值数组中的索引, 通知值将发送给该索引。
uxIndexToNotify 必须小于 configTASK_NOTIFICATION_ARRAY_ENTRIES。
ulValue 用于更新目标任务的通知值。请参阅下面 eAction 参数的说明。
eAction 一种枚举类型,可以采用 下表中记录的值之一来执行相关操作。
pulPreviousNotifyValue 可用于在 xTaskNotifyAndQuery() 操作修改任何位之前 传递目标任务的通知值。pulPreviousNotifyValue 是一个可选参数, 如不需要,可设置为 NULL。如果未使用pulPreviousNotifyValue, 则考虑使用 xTaskNotify() 来 代替 xTaskNotifyAndQuery()。
5.2 Returns:
除 eAction 设置为 eSetValueWithoutOverwrite 且目标任务的通知值 因目标任务已有挂起的通知而无法更新之外, 在所有情况下均返回 pdPASS。
5.3 用法示例:
1uint32_t ulPreviousValue; 2 3/* 在xTask1Handle引用的任务的第0个通知值中设置位8。将任务之前的第0个通知值(比特8设置之前)存储在ulPreviousValue中。 */ 4xTaskNotifyAndQueryIndexed( xTask1Handle, 50, 6( 1UL << 8UL ), 7eSetBits, 8&ulPreviousValue ); 9 10/* 向xTask2Handle引用的任务发送通知,可能会将任务从Blocked状态中移除,但不更新任务的通知值。将任务通知值存储在ulPreviousValue中。 */ 11xTaskNotifyAndQuery( xTask2Handle, 0, eNoAction, &ulPreviousValue ); 12 13/*将xTask3Handle引用的任务的通知值设置为0x50,即使任务没有读取它之前的通知值。任务之前的通知值不感兴趣,因此最后一个参数被设置为NULL。 */ 14xTaskNotifyAndQuery( xTask3Handle, 0x50, eSetValueWithOverwrite, NULL ); 15 16/* 将xTask4Handle引用的任务的通知值设置为0xfff,但前提是这样做不会在任务获得通知值之前覆盖任务的现有通知值(通过调用xTaskNotifyWait()或ulTaskNotifyTake())。任务之前的通知值保存在ulPreviousValue中。 */ 17if( xTaskNotifyAndQuery( xTask4Handle, 180xfff, 19eSetValueWithoutOverwrite, 20&ulPreviousValue ) == pdPASS ) 21{ 22/*任务的通知值已经更新。*/ 23} 24else 25{ 26/* 任务的通知值未更新。 */ 27}