6-xTaskNotifyAndQueryFromISR / xTaskNotifyAndQueryIndexedFromISR
1task.h 2BaseType_t xTaskNotifyAndQueryFromISR( 3TaskHandle_t xTaskToNotify, 4uint32_t ulValue, 5eNotifyAction eAction, 6uint32_t *pulPreviousNotifyValue, 7BaseType_t *pxHigherPriorityTaskWoken ); 8 9BaseType_t xTaskNotifyAndQueryIndexedFromISR( 10TaskHandle_t xTaskToNotify, 11UBaseType_t uxIndexToNotify 12uint32_t ulValue, 13eNotifyAction eAction, 14uint32_t *pulPreviousNotifyValue, 15BaseType_t *pxHigherPriorityTaskWoken );
xTaskNotifyAndQueryIndexedFromISR() 执行的操作 与xTaskNotifyIndexedFromISR() 执行的操作相同,此外, 还会在附加的 pulPreviousNotifyValue 参数中 返回目标任务的先前通知值 (函数被调用时的通知值,而不是函数返回时的通知值)。
xTaskNotifyAndQueryFromISR() 执行的操作与 xTaskNotifyFromISR() 执行的操作相同,此外 还会在附加的 pulPreviousNotifyValue 参数中 返回目标任务的先前通知值 (函数被调用时的通知值,而不是函数返回时的通知值)。
6.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()。
pxHigherPriorityTaskWoken * pxHigherPriorityTaskWoken必须初始化为pdFALSE (0)。
xTaskNotifyAndQueryFromISR ()将设置* pxHigherPriorityTaskWoken 如果发送通知导致一个任务解除阻塞,且解除阻塞的任务的优先级高于当前正在运行的任务, 那么xTaskNotifyFromISR()将把*pxHigherPriorityTaskWoken设置 为pdTRUE。
如果xTaskNotifyAndQueryFromISR()将该值设置为pdTRUE 那么应该在中断退出之前请求 切换上下文。
pxHigherPriorityTaskWoken 为可选参数,且可 设置为 NULL。
6.2 Returns:
除 eAction 设置为 eSetValueWithoutOverwrite 且目标任务的通知值 因目标任务已有挂起的通知而无法更新之外, 在所有情况下均返回 pdPASS。
6.3 用法示例:
1void vAnISR( void ) 2{ 3/* 必须初始化为pdFALSE!*/ 4BaseType_t xHigherPriorityTaskWoken = pdFALSE. 5uint32_t ulPreviousValue; 6 7/* 在xTask1Handle引用的任务的第0个通知值中设置位8。将任务之前的第0个通知值(比特8设置之前)存储在lPreviousValue中。 */ 8xTaskNotifyAndQueryIndexedFromISR( xTask1Handle, 90, 10( 1UL << 8UL ), 11eSetBits, 12&ulPreviousValue, 13&xHigherPriorityTaskWoken ); 14 15/* 任务之前的通知值保存在ulPreviousValue中。 */ 16 17/* 如果xTask1Handle引用的任务处于Blocked状态,等待通知,那么它现在将从Blocked状态移动到就绪状态。如果它的优先级高于当前正在执行的任务(被中断中断的任务)的优先级,那么xhigherprioritytaskkoken将被设置为pdTRUE,并且将该变量传递给portYIELD_FROM_ISR()调用将导致中断直接返回到未阻塞的任务。如果xhigherprioritytaskkoken仍然是pdFALSE,那么将它传递给portYIELD_FROM_ISR()将不起作用。 */ 18 19portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); 20}
7-xTaskNotifyFromISR / xTaskNotifyIndexedFromISR
1task.h 2 3BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, 4uint32_t ulValue, 5eNotifyAction eAction, 6BaseType_t *pxHigherPriorityTaskWoken ); 7 8BaseType_t xTaskNotifyIndexedFromISR( TaskHandle_t xTaskToNotify, 9UBaseType_t uxIndexToNotify, 10uint32_t ulValue, 11eNotifyAction eAction, 12BaseType_t *pxHigherPriorityTaskWoken );
可从中断服务程序 (ISR) 中使用的 xTaskNotify() 和 xTaskNotifyIndexed() 版本。请参阅 xTaskNotify() API 函数的文档页面,了解有关其操作的描述和必要的配置参数,以及向后兼容性信息。
7.1 参数:
xTaskToNotify 正在通知的 RTOS 任务的句柄。这是目标任务。
要获取任务句柄, xTaskCreate() 创建任务并使用 pxCreatedTask 参数,或使用返回值创建任务 xTaskCreateStatic() 并存储该值,或在 调用 xTaskGetHandle() 中使用任务的名称。
当前执行的 RTOS 任务的句柄通过以下方式 由 xTaskGetCurrentTaskHandle() API 函数返回。
uxIndexToNotify 目标任务通知值数组中的索引, 通知值将发送给该索引。
uxIndexToNotify 必须小于 configTASK_NOTIFICATION_ARRAY_ENTRIES。
xTaskNotifyFromISR() 中没有此参数,总是向索引 0 发送通知。
ulValue 用于更新目标任务的通知值。请参阅下面 eAction 参数的说明。
eAction 一种枚举类型,可以采用 下表中记录的值之一来执行相关操作。
pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken 必须初始化为 0。
如果发送通知导致某个任务解除阻塞, 且被解除阻塞的任务的优先级高于当前运行的任务, xTaskNotifyFromISR() 会将 *pxHigherPriorityTaskWoken 设置为 pdTRUE。
如果 xTaskNotifyFromISR() 将此值设置为 pdTRUE, 则应在中断退出之前请求上下文切换 。请参阅以下示例。
pxHigherPriorityTaskWoken 为可选参数,且可 设置为 NULL。
7.2 返回:
除了 eAction 被设置为 eSetValueWithoutOverwrite 且目标任务的通知值 因目标任务已有挂起的通知而无法更新之外, 在所有情况下均返回 pdPASS。
7.3 用法示例:
1此示例演示了如何结合使用 xTaskNotifyFromISR() 和 eSetBits 操作。 2/* 中断处理程序本身不执行任何处理。相反,它解除了一个高优先级的任务,在这个任务中,产生中断的事件被处理。如果任务的优先级足够高,那么中断将直接返回到该任务(因此它将中断一个任务,但返回到另一个任务),因此处理将在时间上连续发生——就像所有的处理都在中断处理程序本身中完成一样。中断外设的状态通过RTOS任务发送给任务通知。 */ 3void vANInterruptHandler( void ) 4{ 5BaseType_t xHigherPriorityTaskWoken; 6uint32_t ulStatusRegister; 7 8/* 读取每个中断源的中断状态寄存器(例如,可能是Rx位、Tx位、缓冲区溢出位等)。 */ 9ulStatusRegister = ulReadPeripheralInterruptStatus(); 10 11/* 清除中断。 */ 12vClearPeripheralInterruptStatus( ulStatusRegister ); 13 14/* xhigherprioritytaskkoken必须初始化为pdFALSE。如果调用xTaskNotifyFromISR()解除阻塞处理任务,并且处理任务的优先级高于当前运行任务的优先级,那么xhigherprioritytaskkoken将自动被设置为pdTRUE。 */ 15xHigherPriorityTaskWoken = pdFALSE; 16 17/* 解除处理任务的阻塞,以便该任务可以执行中断所需的任何处理。xHandlingTask是任务的句柄,是在创建任务时获得的。处理任务的第0个通知值与中断状态按位or -确保已经设置的位不会被覆盖。 */ 18xTaskNotifyIndexedFromISR( xHandlingTask, 190, 20ulStatusRegister, 21eSetBits, 22&xHigherPriorityTaskWoken ); 23 24/* 如果xhigherprioritytaskkoken现在设置为pdTRUE,则强制上下文切换。用于完成此任务的宏依赖于端口,可以称为portEND_SWITCHING_ISR。 */ 25portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); 26} 27/* ----------------------------------------------------------- */ 28 29/* 一个阻塞等待通知外设需要服务的任务,每次通知时处理外设中所有挂起的事件。*/ 30void vHandlingTask( void *pvParameters ) 31{ 32uint32_t ulInterruptStatus; 33 34for( ;; ) 35{ 36/* 无限期地阻塞(没有超时,因此不需要检查函数的返回值)以等待通知。注意!真实的应用程序不应该无限期地阻塞,而是偶尔超时,以处理可能阻止中断发送更多通知的错误条件。*/ 37xTaskNotifyWaitIndexed( 0, /* 等待第0次通知*/ 380x00, /* 进入时不要清除任何位。 */ 39ULONG_MAX, /* 在退出时清除所有位。 */ 40&ulInterruptStatus, /* 接收通知值。 */ 41portMAX_DELAY ); /* 阻塞延时*/ 42 43/* 处理接收到的通知值中设置的任何位。这假设外设设置位1为Rx中断,位2为Tx中断,位3为缓冲区溢出中断。*/ 44if( ( ulInterruptStatus & 0x01 ) != 0x00 ) 45{ 46prvProcessRxInterrupt(); 47} 48 49if( ( ulInterruptStatus & 0x02 ) != 0x00 ) 50{ 51prvProcessTxInterrupt(); 52} 53 54if( ( ulInterruptStatus & 0x04 ) != 0x00 ) 55{ 56prvClearBufferOverrun(); 57} 58} 59}
8-xTaskNotifyWait / xTaskNotifyWaitIndexed
1task.h 2BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, 3uint32_t ulBitsToClearOnExit, 4uint32_t *pulNotificationValue, 5TickType_t xTicksToWait ); 6BaseType_t xTaskNotifyWaitIndexed( UBaseType_t uxIndexToWaitOn, 7uint32_t ulBitsToClearOnEntry, 8uint32_t ulBitsToClearOnExit, 9uint32_t *pulNotificationValue, 10TickType_t xTicksToWait );
[如果你使用 RTOS 任务通知来实现二进制或计数 信号量类型行为,请使用更简单的 ulTaskNotifyTake() API 函数, 而不要使用 xTaskNotifyWait()]
每个任务都有一组“任务通知” (或仅“通知” ),每个 通知都包含状态和一个 32 位值。直达任务通知是直接发送至任务的事件, 可以取消阻塞接收任务,并 可以选择通过多种方式更新接收任务的某个通知值。例如,通知可覆盖接收任务的一个通知值,或仅设置 接收任务的一个通知值中的一位或多位。
xTaskNotifyWait() 会等待调用任务接收通知,并有可选的超时。如果等待的通知到达时,相关的接收 RTOS 任务已被阻塞且正在等待通知,则 接收 RTOS 任务将解除阻塞,通知也将清除。
注意:数组中每个通知都独立运行——在数组中的一个通知上一次只能阻塞一个任务,并且该任务不会被发送到任何其他数组索引的通知取消阻塞。
xTaskNotifyWait() 和 xTaskNotifyWaitIndexed() 是等效的宏,它们唯一的区别 是 xTaskNotifyWaitIndexed() 可以在数组内的任何任务通知上运行, 而 xTaskNotifyWait() 始终在数组索引 0 处的任务通知上运行。
xTaskNotifyGive() 不能从中断服务程序调用。使用 vTaskNotifyGiveFromISR() 代替。
configUSE_TASK_NOTIFICATIONS 必须在 FreeRTOSConfig.h 中设置为 1(或保留为未定义)才能使用这些宏。常量 configTASK_NOTIFICATION_ARRAY_ENTRIES 设置 任务通知的每个任务数组中的索引数量。
向后兼容性信息:
在 FreeRTOS V10.4.0 之前,每个任务有一个单一的“通知值”,且 所有任务通知 API 函数都在该值上运行。用通知值的数组 更换单个通知值需要 新的 API 函数集,该函数集应能在数组内处理 特定通知。xTaskNotifyWait() 是原始 API 函数,并 通过始终在数组内索引 0 处的通知值上运行来保持 向后兼容。调用 xTaskNotifyWait() 等于调用 xTaskNotifyWaitIndexed(),其中 uxIndexToWaitOn 参数设置为 0。
8.1 参数:
uxIndexToWaitOn 调用任务的数组中通知值的索引, 调用任务将在该通知值上等待接收 通知。
uxIndexToWaitOn 必须小于 configTASK_NOTIFICATION_ARRAY_ENTRIES。
xTaskNotifyWait() 没有此参数,总是在索引 0 处等待通知。
ulBitsToClearOnEntry 在 xTaskNotifyWait() 函数入口, ulBitsToClearOnEntry 中设置的任何位都将在调用 RTOS 任务通知值中 被清除(在任务等待新通知之前), 前提是在调用 xTaskNotifyWait() 时通知尚未 挂起。
例如,如果 ulBitsToClearOnEntry 为 0x01, 则任务通知值的位 0 将在函数入口 被清除。
将 ulBitsToClearOnEntry 设置为 0xffffffff (ULONG_MAX) 将 清除任务通知值中的所有位,有效 将值清除为 0。
ulBitsToClearOnExit 在 xTaskNotifyWait() 函数退出之前, ulBitsToClearOnExit 中设置的任何位都将在调用 RTOS 任务通知值中 被清除,前提是接收到通知。
在 RTOS 任务通知值保存到 *pulNotificationValue 中 之后清除位 (请参阅下面的 pulNotificationValue 的说明)。
例如,如果 ulBitsToClearOnExit 为 0x03,则位 0 和 位 1 将在函数退出之前 清除。
将 ulBitsToClearOnExit 设置为 0xffffffff (ULONG_MAX) 将 清除任务通知值中的所有位,有效 将值清除为 0。
pulNotificationValue 用于传出 RTOS 任务的通知值。在由于 ulBitsToClearOnExit 的设置清除任何位之前,复制到 *pulNotificationValue 的值是 RTOS 任务的 通知值 。
如果不需要通知值,则设置 pulNotificationValue 为 NULL。
xTicksToWait 在阻塞状态下等待接收通知的最长时间, 前提是在调用 xTaskNotifyWait() 时通知尚未 挂起。
处于阻塞状态的 RTOS 任务不会消耗 任何 CPU 时间。
时间以 RTOS tick 周期为单位。宏 pdMS_TO_TICKS() 可以 将以毫秒为单位的时间 转换成以 tick 为单位的时间。
8.2 Returns:
在调用 xTaskNotifyWait() 时,如果收到通知, 或通知已经挂起,则返回 pdTRUE。
如果调用 xTaskNotifyWait() 在收到通知之前超时, 则返回 pdFALSE。
8.3 用法示例:
1/* 此任务显示了RTOS任务通知值中的位,用于将不同的事件传递给任务,其方式与事件组中的标志用于相同目的的方式相同。*/ 2void vAnEventProcessingTask( void *pvParameters ) 3{ 4uint32_t ulNotifiedValue; 5 6for( ;; ) 7{ 8/* 无限期地阻塞(没有超时,因此不需要检查函数的返回值)以等待通知。该RTOS任务的通知值中的位由通知任务和中断设置,以指示发生了哪些事件。 */ 9xTaskNotifyWaitIndexed( 0, /* 等待第0次通知。 */ 100x00, /* 不要在进入时清除任何通知位。 */ 11ULONG_MAX, /* 退出时将通知值重置为0。 */ 12&ulNotifiedValue, /* 通知值在ulnotiffiedvalue中传递。 */ 13portMAX_DELAY ); /* 阻塞延时 */ 14 15/* 通知值在ulnotiffiedvalue中传递。 */ 16 17if( ( ulNotifiedValue & 0x01 ) != 0 ) 18{ 19/* 位0被设置-处理由位0表示的任何事件。 */ 20prvProcessBit0Event(); 21} 22 23if( ( ulNotifiedValue & 0x02 ) != 0 ) 24{ 25/*位1被设置-处理由位1表示的任何事件。 */ 26prvProcessBit1Event(); 27} 28 29if( ( ulNotifiedValue & 0x04 ) != 0 ) 30{ 31/* 位2被设置-处理由位2表示的任何事件。*/ 32prvProcessBit2Event(); 33} 34 35/* Etc. */ 36} 37}
9-xTaskNotifyStateClear / xTaskNotifyStateClearIndexed
1task.h 2 3BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ); 4 5BaseType_t xTaskNotifyStateClearIndexed( TaskHandle_t xTask, 6UBaseType_t uxIndexToClear );
每个 RTOS 任务都有一个任务通知数组。每条任务通知 都有通知状态 ,可以是“挂起”或“非挂起” , 以及一个 32 位通知值。
如果通知被发送到通知数组中的索引,那么 该索引处的通知被称为“待定” ,直到任务读取 其通知值,或通过调用 xTaskNotifyStateClear () 将通知状态明确清除为“非挂起”为止 。
xTaskNotifyStateClear () 和 xTaskNotifyStateClearIndexed () 是等效宏——唯一的区别 是 xTaskNotifyStateClearIndexed () 可以在数组内任何任务通知上运行,而 xTaskNotifyStateClear () 始终在数组索引 0 处的任务通知上运行。
configUSE_TASK_NOTIFICATIONS 必须在 FreeRTOSConfig.h 中设置为 1(或保留为未定义)才能使用这些宏。常量 configTASK_NOTIFICATION_ARRAY_ENTRIES 设置 任务通知的每个任务数组中的索引数量。
向后兼容性信息:
在 FreeRTOS V10.4.0 之前,每个任务有一个单一的“通知值”,且 所有任务通知 API 函数都在该值上运行。用通知值的数组 更换单个通知值需要 新的 API 函数集,该函数集应能在数组内处理 。xTaskNotifyStateClear () 是原始 API 函数,并且 通过始终在数组内索引 0 处的通知值上操作来保留向后兼容性 。调用 xTaskNotifyStateClear () 等于调用 xTaskNotifyStateClearIndexed (),其中 uxIndexToNotify 参数设置为 0。
9.1 参数:
xTask 将收到此通知的 RTOS 任务的句柄 状态已清除。将 xTask 设置为 NULL 以清除通知 调用任务的状态。
要获取任务句柄,请使用 xTaskCreate() 创建任务并使用 pxCreatedTask 参数,或使用返回值创建任务 xTaskCreateStatic() 并存储该值,或在 调用 xTaskGetHandle() 中使用任务的名称。
当前执行的 RTOS 任务的句柄通过以下方式 由 xTaskGetCurrentTaskHandle() API 函数返回。
uxIndexToClear 待采取行动通知值索引内的目标任务数组 。例如,将 uxIndexToClear 设置为 1 将清除数组内索引为 1 时的通知状态。
uxIndexToClear 必须小于configTASK_NOTIFICATION_ARRAY_ENTRIES的值。
ulTaskNotifyStateClear() 没有此参数,并且始终作用于 索引 0 的通知上。
9.2 Returns:
如果 xTask 引用的任务有挂起的通知,则通知 已清除,然后返回 pdTRUE。如果 xTask 引用的任务 有待处理的通知,那么返回 pdFALSE。
9.3 用法示例:
1/* 一个示例UART发送函数。该函数启动UART传输,然后等待传输完成的通知。传输完成通知从UART中断发送。在传输开始之前,将清除调用任务的通知状态,以确保在任务试图阻塞其通知状态之前,它不会碰巧已经挂起。*/ 2void vSerialPutString( const signed char * const pcStringToSend, 3unsigned short usStringLength ) 4{ 5const TickType_t xMaxBlockTime = pdMS_TO_TICKS( 5000 ); 6 7/*xSendingTask持有等待传输完成的任务句柄。如果xSendingTask为NULL,则表示传输没有进行。不要开始发送新的字符串,除非前一个字符串的传输已经完成。*/ 8if( ( xSendingTask == NULL ) && ( usStringLength > 0 ) ) 9{ 10/*确保调用任务的第0个通知状态不是挂起的。 */ 11xTaskNotifyStateClearIndexed( NULL, 0 ); 12 13/*存储传输任务的句柄。这用于在传输完成后解除阻塞任务。 */ 14xSendingTask = xTaskGetCurrentTaskHandle(); 15 16/* 开始发送字符串-然后传输由中断控制。*/ 17UARTSendString( pcStringToSend, usStringLength ); 18 19/*在Blocked状态下等待(因此不使用任何CPU时间),直到UART ISR向xSendingTask发送第0个通知,以便在传输完成时通知(并解除阻塞)任务。 */ 20ulTaskNotifyTake( 0, pdTRUE, xMaxBlockTime ); 21} 22}
10-ulTaskNotifyValueClear / ulTaskNotifyValueClearIndexed
1task.h 2 3uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, 4uint32_t ulBitsToClear ); 5 6uint32_t ulTaskNotifyValueClearIndexed( TaskHandle_t xTask, 7UBaseType_t uxIndexToClear, 8uint32_t ulBitsToClear );
每个 RTOS 任务都有一个任务通知数组。每条任务通知 都有通知状态 ,可以是“挂起”或“非挂起” , 以及一个 32 位通知值。
ulTaskNotifyValueClearIndexed() 清除 xTask 引用的任务的数组索引 uxIndexToClear 的通知值中 ulBitsToClear 位掩码指定的位。
ulTaskNotifyValueClear() 和 ulTaskNotifyValueClearIndexed() 是等效的宏 - 唯一的区别 是 ulTaskNotifyValueClearIndexed() 可以对 数组中的任何任务通知进行操作,而 ulTaskNotifyValueClear() 始终在数组索引 0 处对任务通知进行操作。
configUSE_TASK_NOTIFICATIONS 必须在 FreeRTOSConfig.h 中设置为 1(或保留为未定义)才能使用这些宏。常量 configTASK_NOTIFICATION_ARRAY_ENTRIES 设置 每个任务的任务通知数组中的索引数。
10.1参数:
xTask 将清除其通知值中的位的 RTOS 任务的句柄。将 xTask 设置为 NULL 以清除调用任务的通知值中的位。
若要获取任务句柄,请使用 xTaskCreate() 创建任务并使用 pxCreatedTask 参数,或使用 xTaskCreateStatic() 创建任务并存储返回值,或在调用 xTaskGetHandle() 时使用任务名称。
当前执行的 RTOS 任务的句柄由 xTaskGetCurrentTaskHandle() API 函数返回。
uxIndexToClear 目标任务的通知值数组中的索引, 用于清除其中的位。uxIndexToClear 必须小于 configTASK_NOTIFICATION_ARRAY_ENTRIES。ulTaskNotifyValueClear() 没有此参数,并且始终清除 索引 0 处的通知值中的位。
ulBitsToClear 要在 xTask 的通知值中清除的位的位掩码 。将位设置为 1 可清除任务的通知值中的相应位 。将 ulBitsToClear 设置为 0xffffffff(32 位架构上的 UINT_MAX)以 将通知值清除为 0。将 ulBitsToClear 设置为 0 以查询任务的 通知值,而不清除任何位。
10.2 Returns:
清除 ulBitsToClear 指定的位之前的目标任务的通知值。
10.3 用法示例:
1#define MESSAGE_RECEIVED_BIT 8 2#define TICKS_UNTIL_TIMEOUT 100 3 4unsigned long ulNotification, ulMessageReceivedMask; 5 6/* 清除所有的消息接收事件。 */ 7ulMessageReceivedMask = 1u << MESSAGE_RECEIVED_BIT; 8ulTaskNotifyValueClear( ulMessageReceivedMask ); 9 10/*发送一条得到响应的消息。 */ 11send_message(); 12 13/* 阻塞此任务,直到它有另一个挂起的通知。在本例中,任务只使用其通知值的MESSAGE_RECEIVED_BIT,因此下一个事件只能是接收到的消息。*/ 14xTaskNotifyWait( 0u, /* 不要在进入时清除任何通知位。 */ 150u, /* 退出时不要清除任何通知位。 */ 16&ulNotification, 17TICKS_UNTIL_TIMEOUT ); 18 19/*如果没有超时,则接收到唯一可能的事件。在本例中,它就是MESSAGE_RECEIVED_EVENT。 */ 20if( ulNotification == 0u ) 21{ 22/* 超时响应处理 */ 23process_response_timeout(); 24} 25else if( ulNotification == ulMessageReceivedMask ) 26{ 27/* 处理响应事件。 */ 28process_response(); 29ulTaskNotifyValueClear( ulMessageReceivedMask ); 30} 31else 32{ 33/* 示例任务应该只接收MESSAGE_RECEIVED_EVENTS。*/ 34process_error(); 35}