当前位置: 首页 > news >正文

FreeRTOS学习笔记-基于stm32(11)任务通知及相关API函数简介

一、什么是任务通知

        任务通知与队列,信号量,事件标志组类似,也是一种用于任务通信和同步的机制。

任务通知的优点:

        不用创建中间变量来传递数据,任务控制块中的成员变量 ulNotifiedValue 就是这个通知值;

        可以选择:不覆盖接收任务的通知值(如果上次发送给接收任务的通知还没被处理);覆盖接收任务的通知值(类似队列);更新接收任务通知值的一个或多个 bit(类似事件标志组);增加接收任务的通知值(类似信号量)。

任务通知的缺点:

        FreeRTOS 的任务通知只能有一个接收任务,其实大多数的应用都是这种情况;

        接收任务可以因为接收任务通知而进入阻塞态,但是发送任务不会因为任务通知发送失败而阻塞;

        在中断中不能接收通知,但可以发送,因为中断中没有任务控制块这个结构体。

二、任务发送相关API函数

函数描述
xTaskNotify()发送通知,带有通知值并且不保留接收任务原通知值,用在任务中
xTaskNotifyFromISR()发送通知,函数 xTaskNotify()的中断版本
xTaskNotifyGive()发送通知,不带通知值并且不保留接收任务的通知值,此 函数会将接收任务的通知值加一,用于任务中
vTaskNotifyGiveFromISR()发送通知,函数 xTaskNotifyGive()的中断版本
xTaskNotifyAndQuery()发送通知,带有通知值并且保留接收任务的原通知值,用在任务中
xTaskNotiryAndQueryFromISR()发送通知,函数 xTaskNotifyAndQuery()的中断版本,用在中断服务函数中

        xTaskNotify()、xTaskNotifyGive() 和 xTaskNotifyAndQuery(),这三个函数最终调用的都是函数 xTaskGenericNotify(),只是传入的参数不同。

BaseType_t xTaskGenericNotify(TaskHandle_t xTaskToNotify,              //任务句柄uint32_t ulValue,                       //任务通知值eNotifyAction eAction,                  //任务通知更新方式uint32_t * pulPreviousNotificationValue)//保存更新前的任务通知值

1、函数 xTaskNotify():

BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction )

        此函数用于发送任务通知,此函数发送任务通知的时候带有通知值。

        参数:xTaskToNotify:任务句柄,指定任务通知是发送给哪个任务的;

                   ulValue:任务通知值;

                   eAction:任务通知更新的方法,eNotifyAction 是个枚举类型,在文件 task.h 中有如下 定义:

typedef enum
{eNoAction = 0,eSetBits,                 //更新指定的 biteIncrement,               //通知值加一eSetValueWithOverwrite,   //覆写的方式更新通知值eSetValueWithoutOverwrite //不覆写通知值
} eNotifyAction;

        返回值:pdFAIL: 当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回 pdFAIL;

                      pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。

2、函数 xTaskNotifyGive():

BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );

        发送任务通知,不带通知值,此函数只是将任务通知值简单的加一。

        参数:xTaskToNotify:任务句柄,指定任务通知是发送给哪个任务的;

        返回值:pdPASS: 此函数只会返回 pdPASS。

3、函数 xTaskNotifyAndQuery():

BaseType_t xTaskNotifyAndQuery ( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction uint32_t * pulPreviousNotificationValue);

        与xTaskNotify()类似,仅多一个用来保存更新前的通知值的参数。

        参数: xTaskToNotify:任务句柄,指定任务通知是发送给哪个任务的;

                    ulValue:任务通知值;

                    eAction:任务通知更新的方法;

                    pulPreviousNotificationValue:用来保存更新前的任务通知值。

        返回值:pdFAIL: 当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回 pdFAIL;

                      pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。

三、任务通知相关API函数

函数描述
ulTaskNotifyTake()获取任务通知,可以设置在退出此函数的时候将任务通知值清零 或者减一;当任务通知用作二值信号量或者计数信号量的时候使 用此函数来获取信号量
xTaskNotifyWait()等待任务通知,比 ulTaskNotifyTak()更为强大,全功能版任务通 知获取函数

1、函数 ulTaskNotifyTake():

uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );

        获取任务通知函数,当任务通知用作二值信号量或者计数型信号量的时候可以使用此函数来获取信号量。

        参数: xClearCountOnExit:参数为 pdFALSE 的话在退出函数 ulTaskNotifyTake()的时候任务通知值减一,类似计数型信号量;当此参数为 pdTRUE 的话在退出函数的时候任务任务通知值清零,类似二值信号量;

                    xTickToWait: 阻塞时间;

        返回值:任务通知值减少或者清零之前的值。

2、函数 xTaskNotifyWait():

BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry,uint32_t ulBitsToClearOnExit, uint32_t * pulNotificationValue, TickType_t xTicksToWait );

        不管任务通知用作二值信号量、计数型信号量、队列和事件标志组中的哪一种,都可以使用此函数来获取任务通知。但是当任务通知用作位置信号量和计数型信号量的时候推荐使用函数 ulTaskNotifyTake()。

        参数:ulBitsToClearOnEntry:当没有接收到任务通知的时候将任务通知值与此参数的取反值进行按 位与运算,当此参数为 0xffffffff 或者 ULONG_MAX 的时候就会将任务通知值清零。                           ulBitsToClearOnExit:如果接收到了任务通知,在做完相应的处理退出函数之前将任务通知值 与此参数的取反值进行按位与运算,当此参数为 0xffffffff 或者 ULONG_MAX 的时候就会将任务通知值清零。

                   pulNotificationValue:此参数用来保存任务通知值。

                   xTickToWait: 阻塞时间。

        返回值:pdTRUE:获取到了任务通知;

                      pdFALSE:任务通知获取失败。

相关文章:

  • 12306 火车票价格解析 (PHP 解析)
  • 洛谷 P1008 [NOIP1998 普及组] 三连击
  • 被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?
  • 算法金 | 再见!!!梯度下降(多图)
  • 力扣469A
  • C++ 50 之 继承中的对象模型
  • 就因为没在大屏项目加全屏按钮,早上在地铁挨了领导一顿骂
  • javaweb 期末复习
  • 分页插件结合collection标签后分页数量不准确的问题
  • 小知识点快速总结:Batch Normalization Layer(BN层)的作用
  • phpcms仿蚁乐购淘宝客网站模板
  • android的surface
  • Sui主网升级至V1.27.2版本
  • Z世代职场价值观的重塑:从“班味”心态到个人成长的追求
  • vue实现全屏screenfull-封装组件
  • 2018一半小结一波
  • const let
  • Create React App 使用
  • egg(89)--egg之redis的发布和订阅
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • input实现文字超出省略号功能
  • React Native移动开发实战-3-实现页面间的数据传递
  • Spring声明式事务管理之一:五大属性分析
  • Web Storage相关
  • webgl (原生)基础入门指南【一】
  • 一个项目push到多个远程Git仓库
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • ​​​​​​​​​​​​​​Γ函数
  • ​configparser --- 配置文件解析器​
  • ​如何使用QGIS制作三维建筑
  • ​字​节​一​面​
  • #Ubuntu(修改root信息)
  • $(function(){})与(function($){....})(jQuery)的区别
  • (13)DroneCAN 适配器节点(一)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (南京观海微电子)——COF介绍
  • (四)事件系统
  • (转)重识new
  • .net 7 上传文件踩坑
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现
  • .NET DataGridView数据绑定说明
  • .NET gRPC 和RESTful简单对比
  • .so文件(linux系统)
  • ??myeclipse+tomcat
  • @NestedConfigurationProperty 注解用法
  • @requestBody写与不写的情况
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [ 蓝桥杯Web真题 ]-布局切换
  • [20170705]diff比较执行结果的内容.txt
  • [20170713] 无法访问SQL Server