打印
[应用相关]

FreeRTOS-任务通知

[复制链接]
477|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2023-11-9 16:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一.任务通知的相关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
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版本,为任务通知机制提供了更大的灵活性和功能性。


————————————————
版权声明:本文为CSDN博主「图南楠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41975640/article/details/134185206

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1931

主题

15650

帖子

12

粉丝