FreeRTOS-任务通知

news/2024/11/25 23:28:55/

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

http://www.ppmy.cn/news/1192459.html

相关文章

Scala中类的继承、抽象类和特质

1. 类的继承 1.1 Scala中的继承结构 Scala 中继承关系如下图: Any 是整个继承关系的根节点; AnyRef 包含 Scala Classes 和 Java Classes,等价于 Java 中的 java.lang.Object; AnyVal 是所有值类型的一个标记; Nul…

1056 组合数的和

一.问题: 给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字。要求所有可能组合出来的 2 位数字的和。例如给定 2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。 输入格式&a…

成长的寓言:做一棵永远成长的苹果树

一棵苹果树,终于结果了。 第一年,它结了10个苹果,9个被拿走,自己得到1个。对此,苹果树愤愤不平,于是自断经脉,拒绝成长。第二年,它结了5个苹果,4个被拿走&#xff0c…

Ansible中的变量及加密

目录 一、变量的设定 二、变量的使用方式 1、在playbook中直接定义变量 2、在文件中定义变量 3、设定主机变量和清单变量 4、目录设定变量 5、用命令覆盖变量 6、使用数组设定变量 7、注册变量 8、事实变量 9、魔法变量 三、JINJA2模板 四、加密控制 1、创建加…

【Acwing170】加成序列(dfs+迭代加深+剪枝)题解和一点感想

本思路来自acwing算法提高课 题目描述 看本文需要准备的知识 1.dfs算法基本思想 2.对剪枝这个词有个简单的认识 迭代加深思想和此题分析 首先,什么是迭代加深呢?当一个问题的解有很大概率出现在递归树很浅的层,但是这个问题的解本身存在…

数字化时代,谈谈数据资产这件事

在全球数字化转型的大趋势下,数据交易市场有望推动数据要素价值的开放共享和流通。据信通院测算,2021年全球47个重要经济体的数字经济增加值规模高达 38.1 万亿美元,我国2021年数字经济规模也已达到7.1万亿美元。数据之于数字经济的价值不言而…

S32K312 DTCM在代码中使用示例

TCM是一种被直接集成在CPU芯片中的高速缓存,TCM又分为ITCM(Instruction TCM)和DTCM(Data TCM)。ITCM是用来存储代码段的,DTCM是用来存储数据的。 为什么要使用DTCM来存储数据?1)频繁…

uniapp在APP端使用swiper进行页面不卡顿滑动

uniapp在APP端使用swiper进行页面会卡顿&#xff0c;主要是渲染的数据有点多&#xff0c;这里只渲染三个数据就不好那么卡顿了&#xff0c;每次滑动后更新数据 <view><swiper change"changePoint" circular :disable-touch"disableTouch"><…