一.任务通知的相关API
1. vTaskNotifyGive(): 用于给指定任务发送通知。
void vTaskNotifyGive( TaskHandle_t xTaskToNotify );参数说明:
xTaskToNotify: 被通知的任务的句柄。返回值:
无。
2. ulTaskNotifyTake(): 用于等待并接收任务通知。
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );参数说明:
xClearCountOnExit: 在接收到通知后是否清除计数器。
xTicksToWait: 等待通知的超时时间,若设置为0,则表示无限等待。返回值:
接收到的通知值。
3. xTaskNotifyStateClear(): 用于清除任务的通知值。
void xTaskNotifyStateClear( TaskHandle_t xTask );参数说明:
xTask: 需要清除通知值的任务句柄。返回值:
无。
4. xTaskNotifyWait(): 用于等待并接收任务通知。
ulBitsToClearOnEntry 参数表示进入等待状态前要清除的任务通知位。它是一个按位掩码参数,可以指定多个任务通知位。当任务调用 xTaskNotifyWait() 进入等待状态时,如果任务通知中的任何一位被设置为 1,那么它们将在进入等待前被清除。这样做可以确保任务在等待状态下不会立即返回,而是等待新的任务通知事件的发生。
ulBitsToClearOnExit 参数表示退出等待状态时要清除的任务通知位。它是一个按位掩码参数,可以指定多个任务通知位。当任务从等待状态返回时,如果任务通知中的任何一位被设置为 1,那么它们将在返回前被清除。这样做可以确保任务在返回后不再保留之前的任务通知状态,从而为下一次的等待状态做好准备。
通过使用 ulBitsToClearOnEntry 和 ulBitsToClearOnExit 参数,可以灵活地管理任务通知的状态。例如,可以在进入等待状态前清除某些特定的任务通知位,以确保任务在等待期间不被之前的通知事件干扰。同时,在任务返回后清除任务通知位,可以为下一次等待状态做好准备。
BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait );参数说明:
ulBitsToClearOnEntry: 在等待通知前需要清除的位。
ulBitsToClearOnExit: 在接收到通知后需要清除的位。
pulNotificationValue: 用于存储接收到的通知值的指针。
xTicksToWait: 等待通知的超时时间,若设置为0,则表示无限等待。返回值:
若在指定时间内接收到通知,则返回pdPASS(1);否则返回pdFALSE(0)。
5. xTaskNotify():用于向指定任务发送通知。
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );参数说明:
xTaskToNotify: 被通知的任务的句柄。
ulValue: 传递给任务的通知值。
eAction: 指定任务在接收到通知时要采取的操作。返回值:
若成功发送通知,则返回pdPASS(1);否则返回errQUEUE_FULL。
6. xTaskNotifyWaitIndexed(): 用于等待多个任务的通知。
BaseType_t xTaskNotifyWaitIndexed( uint32_t uxIndexToWaitFor, uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait );参数说明:
uxIndexToWaitFor: 等待的任务的索引,从0开始。
ulBitsToClearOnEntry: 在等待通知前需要清除的位。
ulBitsToClearOnExit: 在接收到通知后需要清除的位。
pulNotificationValue: 用于存储接收到的通知值的指针。
xTicksToWait: 等待通知的超时时间,若设置为0,则表示无限等待。返回值:
若在指定时间内接收到通知,则返回pdPASS(1);否则返回pdFALSE(0)。
7. xTaskNotifyGiveFromISR(): 用于在中断服务程序中给指定任务发送通知。
BaseType_t xTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken );参数说明:
xTaskToNotify: 被通知的任务的句柄。
pxHigherPriorityTaskWoken: 在执行该函数时是否唤醒了更高优先级的任务的标志位。返回值:
若成功发送通知,则返回pdPASS(1);否则返回pdFAIL(0)。
8. xTaskGenericNotify(): 用于向指定任务发送通知,并返回任务接收到的通知值。
BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue );参数说明:
xTaskToNotify: 被通知的任务的句柄。
ulValue: 传递给任务的通知值。
eAction: 指定任务在接收到通知时要采取的操作。
pulPreviousNotificationValue: 用于存储任务之前的通知值的指针。返回值:
若成功发送通知,则返回pdPASS(1);否则返回errQUEUE_FULL。
二、使用FreeRTOS任务通知
1. 定义通知宏RECEIVE
#define RECEIVE 1
2. 创建任务TaskA接收任务通知
TaskHandle_t xHandleTaskA = NULL;
void TaskA(void *pvParameters)
{const TickType_t xMaxBlockTime = pdMS_TO_TICKS(503);BaseType_t xResult = pdFALSE;u32 ulNotifiedValue = 0U;while (1){xResult = xTaskNotifyWait(pdFALSE, BLE_EVENT_ALL, &ulNotifiedValue, xMaxBlockTime);if (xResult == pdPASS){if ((ulNotifiedValue & RECEIVE) != 0){//RECEIVE 通知接收成功}}}
}xTaskCreate(TaskA, "TaskA", 128, NULL, 5, &xHandleTaskA);
3. 发送任务通知
void SendNotify(void)
{u32 ulNotifiedValue = 0U;xTaskGenericNotify(xHandleTaskA , RECEIVE, eSetBits, &ulNotifiedValue);
}
三、常用的FreeRTOS任务通知API对比
1. ulTaskNotifyTake和xTaskNotifyWait
ulTaskNotifyTake和xTaskNotifyWait都是FreeRTOS中用于等待任务通知的API,它们之间的区别如下:
参数和返回值:
ulTaskNotifyTake:使用较少的参数,只需指定清除通知计数的选项,并将通知计数作为返回值。如果未收到通知,则会一直等待。
xTaskNotifyWait:具有更多的参数,包括期望的通知值、清除通知计数的选项以及最大等待时间。它不仅可以等待传递给目标任务的通知值,还可以等待其它事件、信号量或队列等。兼容性:
ulTaskNotifyTake:是FreeRTOS早期版本中提供的API之一,已被xTaskNotifyWait取代。
xTaskNotifyWait:引入自FreeRTOS v10.3.0版本,取代了旧版本的vTaskNotifyWait()函数,以提供更好的可用性和兼容性。功能和灵活性:
ulTaskNotifyTake:主要用于在任务之间发送简单通知,只能接收二进制信号量,并不能直接接收任意的32位通知值。
xTaskNotifyWait:通用的任务等待函数,可以用于等待任务通知、信号量、队列等。除了等待通知值外,还可以等待其他类型的事件,从而提高了灵活性和适用性。
2 ulTaskNotifyTake和xTaskNotifyWait
xTaskNotify和xTaskGenericNotify是FreeRTOS中用于任务通知的两个API,它们之间的区别如下:
功能和灵活性:
xTaskNotify:是一个专门设计用于在任务之间发送简单通知的API。它基于二进制信号量实现,只能传递一个固定值(0或非0)给目标任务。在接收通知时,目标任务可以选择清除通知计数。
xTaskGenericNotify:是一个通用的任务通知函数,提供了更强大和灵活的功能。它基于32位通知值,可以传输任意值给目标任务,并且可以根据需要执行多种操作,如清除通知计数、设置计数器为特定值等。参数和返回值:
xTaskNotify:使用较少的参数,只需指定目标任务句柄、通知值和是否清除通知计数。
xTaskGenericNotify:具有更多的参数,包括目标任务句柄、通知值、操作选项和保存之前通知值的指针。返回值方面,xTaskNotify返回通知是否成功发送,而xTaskGenericNotify可以返回通知是否成功发送以及之前的通知值。兼容性:
xTaskNotify:引入自FreeRTOS v10.3.0版本,并取代了旧版本的vTaskNotifyGive()和ulTaskNotifyTake()函数,以提供更好的可用性和兼容性。
xTaskGenericNotify:引入自FreeRTOS v10.4.0版本,为任务通知机制提供了更大的灵活性和功能性。