9.FreeRTOS学习笔记-任务通知
基本概念
- 每个任务都有一个 32 位的通知值
- 任务通知可以替代二值信号量、计数信号量、事件组,也可以替代长度为 1 的队列(可以保存一个 32位整数或指针值)
- 通知比通过信号量等 ICP 通信方式解除阻塞的任务要快 45%,,并且更加省 RAM 内存空间
- 打卡宏定义 configUSE_TASK_NOTIFICATIONS 设置为 1
- 任务通知是属于任务中附带的资源,所以在任务被创建的时候,任务通知也被初始化的
- 任务通知可以在任务中向指定任务发送通知,也可以在中断中向指定任务发送通知
- 只有在任务中可以等待通知,而不允许在中断中等待通知
- 任务在等待的通知暂时无效,任务会根据用户指定的阻塞超时时间进入阻塞状态
FreeRTOS 提供以下几种方式发送通知给任务
- 发送通知给任务, 如果有通知未读,不覆盖通知值。
- 发送通知给任务,直接覆盖通知值。
- 发送通知给任务,设置通知值的一个或者多个位,可以当做事件组来使用。
- 发送通知给任务,递增通知值,可以当做计数信号量使用。
以下限制 :
- 只能有一个任务接收通知消息,因为必须指定接收通知的任务
- 只有等待通知的任务可以被阻塞,发送通知的任务,在任何情况下都不会因为发送失败而进入阻塞*态。
控制结构
参数 | 说明 |
---|---|
ulNotifiedValue | 任务通知的值,可以保存一个 32 位整数或指针值。 |
ucNotifyState | 任务通知状态,用于标识任务是否在等待通知 |
函数接口
发送通知
发送通知函数 xTaskGenericNotify()–通用版
BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue )
参数 | 说明 |
---|---|
TaskHandle_t xTaskToNotify | 被通知的任务句柄 |
uint32_t ulValue | 发送的通知值 |
eNotifyAction eAction | 指明更新通知值的方式 |
uint32_t * pulPreviousNotificationValue | 任务原本的通知值返回 |
eAction可选值
typedef enum
{eNoAction = 0, /*对象任务接收任务通知,但是不更新值. */eSetBits, /* 设置指定的位,按位或。*/eIncrement, /* 通知值加1*/eSetValueWithOverwrite, /* 覆盖通知值 */eSetValueWithoutOverwrite /* 没有值就设置,有值就不覆盖 */
} eNotifyAction;
参数 | 说明 |
---|---|
eNoAction = 0, | 对象任务接收任务通知,但是不更新值. |
eSetBits, | /设置指定的位,按位或。 |
eIncrement, | /通知值加1 |
eSetValueWithOverwrite, 覆盖通知值 | |
eSetValueWithoutOverwrite | 没有值就设置,有值就不覆盖 |
发送 加1 通知–普通版
#define xTaskNotifyGive( xTaskToNotify ) xTaskGenericNotify( ( xTaskToNotify ), ( 0 ), eIncrement, NULL )
发送 加1 通知–中断版
void vTaskNotifyGiveFromISR(TaskHandle_t xTaskToNotify,BaseType_t *pxHigherPriorityTaskWoken);
参数 | 说明 |
---|---|
xTaskToNotify | 接收通知的任务句柄,并让其自身的任务通知值加 1。 |
pxHigherPriorityTaskWoken | pxHigherPriorityTaskWoken 在使用之前必须先初始化为pdFALSE。当调用该函数发送一个任务通知时,目标任务接收到通知后将从阻塞态变为就绪态,并且如果其优先 级 比 当 前 运 行 的 任 务 的 优 先 级 高 , 那 么pxHigherPriorityTaskWoken 会被设置为 pdTRUE,然后在中断退出前执行一次上下文切换,去执行刚刚被唤醒的中断优先级较高的任务。pxHigherPriorityTaskWoken是一个可选的参数可以设置为 NULL。 |
发送带有 值 的通知
#define xTaskNotify( xTaskToNotify, ulValue, eAction ) \xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), NULL )BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify,uint32_t ulValue,eNotifyAction eAction );
中断发送任务通知通用函数xTaskGenericNotifyFromISR()
#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) \xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) )BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify,uint32_t ulValue,eNotifyAction eAction,BaseType_t *pxHigherPriorityTaskWoken );
参数 | 说明 |
---|---|
pxHigherPriorityTaskWoken | pxHigherPriorityTaskWoken 在使用之前必须先初始化为pdFALSE。当调用该函数发送一个任务通知时,目标任务接收到通知后将从阻塞态变为就绪态,并且如果其优先 级 比 当 前 运 行 的 任 务 的 优 先 级 高 , 那 么pxHigherPriorityTaskWoken 会被设置为 pdTRUE,然后在中断退出前执行一次上下文切换,去执行刚刚被唤醒的中断优先级较高的任务。pxHigherPriorityTaskWoken是一个可选的参数可以设置为 NULL。 |
返回值 | 参数 eAction 为 eSetValueWithoutOverwrite 时,如果被通知任务还没取走上一个通知,又接收到了一个通知,则这次通知值未能更新并返回 pdFALSE,其他情况均返回pdPASS。 |
中断中发送任务通知通用函数 xTaskGenericNotifyFromISR()
BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, //用于保存任务上一个通知值BaseType_t *pxHigherPriorityTaskWoken )//须先初始化为 pdFALSE,//有高于自己优先级的执行一次上下文切换,设置pxHigherPriorityTaskWoken =pdTRUE,也可以设置位NULL
发送通知 xTaskNotifyAndQuery()
与 xTaskNotify()很像,多 了 一 个 附 加 的 参 数pulPreviousNotifyValue 用于回传接收任务的上一个通知值
#define xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue ) \xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) )
中断版’带返回’上次值得发送通知函数
#define xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) \xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) )
获取通知
获取任务通知函数只能用在任 务中,没有 带中断保 护版本,因 此只有两 个 API 函 数: ‘ulTaskNotifyTake()’ 和’xTaskNotifyWait()’。
ulTaskNotifyTake()
- 作为二值信号量和计数信号量的一种轻量级实现,速度更快
- 用于获取一个任务通知,获取二值信号量、计数信号量类型的任务通知。
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit,TickType_t xTicksToWait );
参数 | 说明 |
---|---|
xClearCountOnExit | 设置为 pdFALSE 时,通知值减 1,可以用来实现计数信号量;设置为 pdTRUE 时,清零,可以用来实现二值信号量。 |
xTicksToWait | 超时时间,单位为系统节拍周期。宏 pdMS_TO_TICKS 用于将毫 转化为系统节拍数。 |
返回值 | 返回任务的当前通知值,在其减 1 或者清 0 之前。 |
全功能版的等待任务通知获取
BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry,uint32_t ulBitsToClearOnExit,uint32_t *pulNotificationValue,TickType_t xTicksToWait );
参数 | 说明 |
---|---|
ulBitsToClearOnEntry | 表示在使用通知之前,将任务通知值的哪些 位 清 0 |
ulBitsToClearOnExit | 表示在函数 xTaskNotifyWait()退出前,决定任务接收到的通知值的哪些位会被清 0,在清 0 前,接收到的任务通知值会先被保存到形参*pulNotificationValue 中。 |
pulNotificationValue | 用于保存接收到的任务通知值。如果接收到的任务通知不需要使 用 , 则 设 置 为 NULL 即可。 |
xTicksToWait | 等待超时时间,单位为系统节拍周期。宏 pdMS_TO_TICKS 用于将单位毫秒转化为系统节拍数。 |
返回值 | 如果获取任务通知成功则返回 pdTRUE,失败则返回 pdFALSE。 |
9.FreeRTOS学习笔记-任务通知相关推荐
- freeRtos学习笔记 (8) 任务通知
freeRtos学习笔记 freeRtos任务通知 任务通知的优缺点 freeRtos任务控制块中包含两个32位的变量,用于任务通知,在一些情况下,任务通知可以替代信号量和事件组,并且比信号量和事件组 ...
- freeRtos学习笔记 (7)信号量
freeRtos学习笔记 freeRtos信号量 信号量种类 信号量分为四种:二值信号量,互斥信号量,计数信号量和递归互斥信号量,其中计数信号量用于管理系统多个共享资源,用计数值表示可用资源数目;二值 ...
- FreeRTOS学习笔记
FreeRTOS学习笔记 (这是我自己学习FreeRTOS整理的笔记,仅供参考) 第一部分:实现FreeRTOS内核 变量名: 定义变量时往往会把变量的类型当作前缀加在变量上 变量类型 前缀 char ...
- 1、野火freertos学习笔记
野火freertos学习笔记 1.任务 1.1 栈 1.2 任务的切换 taskYIELD(); 1.3 临界段 2.空闲任务 3.任务优先级 4.任务延时的表现 5.时间片 5.1抢占式.协做式 6 ...
- 【ESP32+freeRTOS学习笔记-开篇前言】
目录 前言的前言 RTOS的选择 开发与实践环境 参考资料 笔记的形式 专题文章的链接(持续更新中......) 前言的前言 单片机的开发,也有两年多了,之前一直是做一些简单应用,因此以裸机开发的方式 ...
- FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析
FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析 怎么查找就绪任务中优先级最高的? tasks.c中声明了一个全局变量 uxTopReadyPriority,任务从其他状态进入就绪 ...
- freeRtos学习笔记 (9) 移植和CPU利用率统计
freeRtos学习笔记 (9) 移植和CPU利用率统计 使用官方固件移植 首先准备一个能跑的裸机工程 注意,freertos需要使用systick定时器,而stm32HAL库默认使用systick作 ...
- freeRtos学习笔记 (6)软件定时器
freeRtos学习笔记 freeRtos软件定时器 软件定时器需要注意事项 软件定时器的精度基于时钟节拍,例如系统时钟节拍为10ms, 软件定时器定时时间必须是10ms的整数倍,因此软件定时器一般用 ...
- freeRtos学习笔记 (5)事件组
freeRtos学习笔记 freeRtos事件组 为什么要用事件组? 多任务环境下, 任务.中断之间往往需要同步操作,一个事件发生会告知等待中的任 务,即形成一个任务与任务.中断与任务间的同步.事件可 ...
最新文章
- 海外web平台访问速度慢的原因之一
- 如何使用Docker暴露多个端口?
- NoSuchMethodError 常见原因及解决方法
- WordPress主题导航源码webstackpro-支持个人自定义本地保存
- c++ regex用法实例 2
- java batik读取svg_Java Batik操作SVG,实现svg读取,生成,动态操作
- 2021年全国水体分布(按省、市、县)矢量数据的制作与分享
- Win10 Edge浏览器如何截网页长图
- 12--CSS导航栏(知识点复习)
- 尝试做自己不喜欢的事,并努力将其做好
- SeedLab10: Linux Firewall Exploration Lab
- Qt常用轮子合集(带使用Demo)
- 195. 中文小说出海资料整理
- 分享一次联想笔记本的售后体验
- 从nmn临床研究最新消息背后,我认识到了w+nmn和nmn的区别重要性
- plot画图 python 双线_Python使用多种滤波器对脑电数据去除伪影
- 最新水利水电安全员考试多选练习题库
- 提升客户生命周期价值(CLV)的5大方法
- 店宝宝:淘宝特价版直面拼多多靠的是什么?
- 我的家庭网络解决方案 篇三:Windows为主,群晖为辅的NAS软件设置
热门文章
- java 对象压缩_理解Java对象:要从内存布局及底层机制说起,话说....
- mql 查询多结果_明世告诉你!广东成考成绩、录取结果怎么查?(附最低分数线)...
- clocks_per_sec 时间不正确_壁挂炉不用了怎么关?壁挂炉正确的关闭方法
- 解决python导入当前文件夹下的包时可以运行,但编辑器报错
- 平衡二叉树(AVL)python实现
- linux网卡主备,linux网卡bounding的主备模式下上层路由端需要什么设置?
- java nextbyte()_java.util.Scanner.hasNextByte()方法实例
- java 转dwg转图片_dwg转pdf要怎么转换
- core控制器属性注入的用处_asp.net-core – 如何使用Autofac和ASP.NET Core在控制器上启用属性注入?...
- 48.孩子们的游戏(圆圈中最后剩下的数)