FreeRTOS-任务通知

一.任务通知的相关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版本,为任务通知机制提供了更大的灵活性和功能性。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值