19-FreeRTOS 任务通知API(下)

简介: 19-FreeRTOS 任务通知API

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}
相关文章
|
1月前
|
存储 算法 关系型数据库
实时计算 Flink版产品使用合集之在Flink Stream API中,可以在任务启动时初始化一些静态的参数并将其存储在内存中吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
97 4
|
20天前
|
DataWorks 安全 API
DataWorks产品使用合集之有api或者是sdk可以获取到 dataworks 的任务运行的结果吗
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
14 1
|
1月前
|
XML API 数据格式
工作流JBPM操作API组任务
工作流JBPM操作API组任务
24 1
|
1月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之是否可以使用 DataStream API 或 Flink SQL 开发任务
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
API 数据库
工作流JBPM操作API办理任务&流程变量
工作流JBPM操作API办理任务&流程变量
21 0
|
1月前
|
API 数据库
工作流JBPM操作API启动实例&查询任务
工作流JBPM操作API启动实例&查询任务
24 0
|
1月前
|
存储 关系型数据库 API
Python 任务自动化工具:nox 的配置与 API
Python 任务自动化工具:nox 的配置与 API
31 0
|
2天前
|
人工智能 运维 Serverless
函数计算产品使用问题之启动的实例是否有调用api接口停止功能
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
2天前
|
数据挖掘 API 开发者
​Email API有哪些,最好的3个API接口有哪些
Email API如SendGrid、Mailgun和AOKSend是企业自动化邮件通信的关键工具。它们提供邮件发送、接收和管理功能,提升效率,优化客户体验。SendGrid以其高可靠性、强大分析和易于集成备受青睐;Mailgun以灵活性和高发送率著称;而AOKSend则以其高效、详细分析和易用性脱颖而出。通过使用这些API,企业能实现定制化邮件服务,跟踪性能,提升邮件营销效果。
|
2天前
|
API
个人微信api接口源代码
个人微信api接口源代码