基本概念

  • 每个任务都有一个 32 位的通知值
  • 任务通知可以替代二值信号量、计数信号量、事件组,也可以替代长度为 1 的队列(可以保存一个 32位整数或指针值)
  • 通知比通过信号量等 ICP 通信方式解除阻塞的任务要快 45%,,并且更加省 RAM 内存空间
  • 打卡宏定义 configUSE_TASK_NOTIFICATIONS 设置为 1
  • 任务通知是属于任务中附带的资源,所以在任务被创建的时候,任务通知也被初始化的
  • 任务通知可以在任务中向指定任务发送通知,也可以在中断中向指定任务发送通知
  • 只有在任务中可以等待通知,而不允许在中断中等待通知
  • 任务在等待的通知暂时无效,任务会根据用户指定的阻塞超时时间进入阻塞状态

FreeRTOS 提供以下几种方式发送通知给任务

  1. 发送通知给任务, 如果有通知未读,不覆盖通知值。
  2. 发送通知给任务,直接覆盖通知值。
  3. 发送通知给任务,设置通知值的一个或者多个位,可以当做事件组来使用。
  4. 发送通知给任务,递增通知值,可以当做计数信号量使用。

以下限制 :

  1. 只能有一个任务接收通知消息,因为必须指定接收通知的任务
  2. 只有等待通知的任务可以被阻塞,发送通知的任务,在任何情况下都不会因为发送失败而进入阻塞*态。

控制结构

参数 说明
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学习笔记-任务通知相关推荐

  1. freeRtos学习笔记 (8) 任务通知

    freeRtos学习笔记 freeRtos任务通知 任务通知的优缺点 freeRtos任务控制块中包含两个32位的变量,用于任务通知,在一些情况下,任务通知可以替代信号量和事件组,并且比信号量和事件组 ...

  2. freeRtos学习笔记 (7)信号量

    freeRtos学习笔记 freeRtos信号量 信号量种类 信号量分为四种:二值信号量,互斥信号量,计数信号量和递归互斥信号量,其中计数信号量用于管理系统多个共享资源,用计数值表示可用资源数目;二值 ...

  3. FreeRTOS学习笔记

    FreeRTOS学习笔记 (这是我自己学习FreeRTOS整理的笔记,仅供参考) 第一部分:实现FreeRTOS内核 变量名: 定义变量时往往会把变量的类型当作前缀加在变量上 变量类型 前缀 char ...

  4. 1、野火freertos学习笔记

    野火freertos学习笔记 1.任务 1.1 栈 1.2 任务的切换 taskYIELD(); 1.3 临界段 2.空闲任务 3.任务优先级 4.任务延时的表现 5.时间片 5.1抢占式.协做式 6 ...

  5. 【ESP32+freeRTOS学习笔记-开篇前言】

    目录 前言的前言 RTOS的选择 开发与实践环境 参考资料 笔记的形式 专题文章的链接(持续更新中......) 前言的前言 单片机的开发,也有两年多了,之前一直是做一些简单应用,因此以裸机开发的方式 ...

  6. FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析

    FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析 怎么查找就绪任务中优先级最高的? tasks.c中声明了一个全局变量 uxTopReadyPriority,任务从其他状态进入就绪 ...

  7. freeRtos学习笔记 (9) 移植和CPU利用率统计

    freeRtos学习笔记 (9) 移植和CPU利用率统计 使用官方固件移植 首先准备一个能跑的裸机工程 注意,freertos需要使用systick定时器,而stm32HAL库默认使用systick作 ...

  8. freeRtos学习笔记 (6)软件定时器

    freeRtos学习笔记 freeRtos软件定时器 软件定时器需要注意事项 软件定时器的精度基于时钟节拍,例如系统时钟节拍为10ms, 软件定时器定时时间必须是10ms的整数倍,因此软件定时器一般用 ...

  9. freeRtos学习笔记 (5)事件组

    freeRtos学习笔记 freeRtos事件组 为什么要用事件组? 多任务环境下, 任务.中断之间往往需要同步操作,一个事件发生会告知等待中的任 务,即形成一个任务与任务.中断与任务间的同步.事件可 ...

最新文章

  1. 海外web平台访问速度慢的原因之一
  2. 如何使用Docker暴露多个端口?
  3. NoSuchMethodError 常见原因及解决方法
  4. WordPress主题导航源码webstackpro-支持个人自定义本地保存
  5. c++ regex用法实例 2
  6. java batik读取svg_Java Batik操作SVG,实现svg读取,生成,动态操作
  7. 2021年全国水体分布(按省、市、县)矢量数据的制作与分享
  8. Win10 Edge浏览器如何截网页长图
  9. 12--CSS导航栏(知识点复习)
  10. 尝试做自己不喜欢的事,并努力将其做好
  11. SeedLab10: Linux Firewall Exploration Lab
  12. Qt常用轮子合集(带使用Demo)
  13. 195. 中文小说出海资料整理
  14. 分享一次联想笔记本的售后体验
  15. 从nmn临床研究最新消息背后,我认识到了w+nmn和nmn的区别重要性
  16. plot画图 python 双线_Python使用多种滤波器对脑电数据去除伪影
  17. 最新水利水电安全员考试多选练习题库
  18. 提升客户生命周期价值(CLV)的5大方法
  19. 店宝宝:淘宝特价版直面拼多多靠的是什么?
  20. 我的家庭网络解决方案 篇三:Windows为主,群晖为辅的NAS软件设置

热门文章

  1. java 对象压缩_理解Java对象:要从内存布局及底层机制说起,话说....
  2. mql 查询多结果_明世告诉你!广东成考成绩、录取结果怎么查?(附最低分数线)...
  3. clocks_per_sec 时间不正确_壁挂炉不用了怎么关?壁挂炉正确的关闭方法
  4. 解决python导入当前文件夹下的包时可以运行,但编辑器报错
  5. 平衡二叉树(AVL)python实现
  6. linux网卡主备,linux网卡bounding的主备模式下上层路由端需要什么设置?
  7. java nextbyte()_java.util.Scanner.hasNextByte()方法实例
  8. java 转dwg转图片_dwg转pdf要怎么转换
  9. core控制器属性注入的用处_asp.net-core – 如何使用Autofac和ASP.NET Core在控制器上启用属性注入?...
  10. 48.孩子们的游戏(圆圈中最后剩下的数)