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:任务通知获取失败。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/30136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大量worker process is shutting down导致nginx服务器请求异常

现象:生产环境网站接口监控报大量超时告警 排查: 查看是否属于异常攻击 1、查看公网slb带宽使用情况 2、查看nginx日志,看是否有异常流量 查看服务器及服务状态 1、查看nginx服务器资源cpu使用情况 2、查看nginx服务状态(ps -ef|grep ng…

抖音短剧看剧系统是怎么做的?怎么样搭建上线运营?

前言: 当前热门短剧已深入大家的日常,针对一些好的短剧更是吸金无数。今天给大家介绍一下短剧这个项目整个运作模式。 一、一部短剧是怎么样呈现到观众眼前的? 首先影视作品公司拍摄剪辑好短剧 ,弄好一切审核后,放到…

Chatgpt教我打游戏攻略

宝可梦朱 我在玩宝可梦朱的时候,我的同行队伍里有黏美儿,等级为65,遇到了下雨天但是没有进化,为什么呢? 黏美儿(Goomy)要进化为黏美龙(Goodra),需要满足以下…

vue-cli 根据文字生成pdf格式文件 jsPDF

1.安装jspdf npm install jspdf --save 2.下载ttf格式文件 也可以用C:\Windows\Fonts下的字体文件,反正调一个需要的ttf字体文件就行,但有的字体存在部分字体乱码现象 微软雅黑ttf下载地址: FontsMarket.com - Download Microsoft YaHei …

访问0xdddddddd内存地址引发软件崩溃的实战问题排查

目录 1、问题描述 2、访问空指针或者野指针 3、C程序中常见的异常内存值 4、0xdddddddd内存访问违例问题分析与排查 4.1、初步分析 4.2、CConfMeidaConfigDlg窗口类对象是何时被销毁的? 4.3、为啥会访问到已经释放内存的CConfMeidaConfigDlg类对象&#xff1…

(2)图像识别yolov5—识别图片视频等文件

目录 一、识别示例图片 二、识别视频 三、修改 detect.py 代码以输出物体坐标,更改识别方式 四、更改后的演示代码: 一、识别示例图片 在yolov5文件夹中,有两个示例图片,这里我们对示例图片进行识别。 打开命令行,进入到当前yolov5目录,通过运行下面的指令,然后对…

5.3. 平稳序列-次可加遍历定理

次可加遍历定理 1. 次可加遍历定理1.1. 次可加遍历定理1.2. 示例2. 应用2.1. 随机矩阵乘积2.2. 随机排序后递增序列的最大长度2.3. 首次到达路径1. 次可加遍历定理 1.1. 次可加遍历定理 定理6.4.1.次可加遍历定理 假设 X m , n , 0 ≤ m < n X_{m, n}, 0 \leq m<n X

QTimer、QElapsedTimer、timeout()事件、singleShot事件

实现 QTimer 定时器 、timeout()事件、singleShot事件的使用 QElapsedTimer 计数器的使用 布局 设置第一个和第二个groupBox高度为固定 timerexample.cpp #include "timerexample.h" #include "ui_timerexample.h" #include "QTime" #include …

分享一个dnslog在线平台

DNSLog Platform 页面只有两个按钮&#xff0c;点击Get Subdomain可以随机生成一个dnslog 点击Refresh Record&#xff0c;刷新这个dnslog的记录。可以查看到这条dnslog的IP地址和创建时间。

QT6不自动生成pro文件

安装了QT的新版本结果他不自动生成pro文件了导致下次打开很复杂 记得在创建时选择qmake&#xff0c;因为新版默认cmake

大模型“诸神之战”,落地才是赛点

ChatGPT 诞生已经快一年&#xff0c;你还在与它对话吗&#xff1f; 有的人用来写报告、改代码&#xff0c;让它成为得力帮手&#xff1b;有的人却只是“调戏”个两三回&#xff0c;让它创作诗歌或故事&#xff0c;便不再“宠幸”。 根据网站分析工具 SimilarWeb 的数据&#…

Zookeeper 集群广播事务性能如何保证?

Zookeeper 集群广播事务性能如何保证? zookeeper是如何保证广播事务时,从开始到多数节点确认事务这个高效的? 在 Zookeeper 中,确保广播事务从开始到多数节点确认的高效性至关重要。Zookeeper 通过以下几个关键机制 和优化策略来实现这一目标: ZAB 协议(Zookeeper Atom…

delphi 如何使用TEdgeBrowser组件以及打包环境在其他主机上运行

不管开发环境还是第三方环境先安装运行时库&#xff1a;Microsoft Edge WebView2 | Microsoft Edge Developer 开发环境可以直接通过&#xff1a; delphi IDE安装 安装完毕后进入到指定路径&#xff0c;复制里面的WebView2Loader.dll到你要开发的程序根目录&#xff1a; 大致路…

CentOS7下修改配置yum源

在CentOS 7中&#xff0c;修改YUM源可以通过以下步骤进行&#xff1a; 1. 备份当前的YUM源: cp -ar /etc/yum.repos.d /etc/yum.repos.d.bak 2. 清除原有的YUM源文件: rm -f /etc/yum.repos.d/* 3.以阿里云YUM源为例&#xff0c;创建一个新的YUM源配置文件: vim /etc/yum.repo…

未来工牌:蓝牙智联的彩色墨水屏工牌

在快节奏的现代职场中&#xff0c;传统的工牌已无法满足人们对于个性化和智能化的需求。为此&#xff0c;我们创新研发了一款4寸电子墨水屏工牌&#xff0c;它不仅仅是一个身份的象征&#xff0c;更是一个集蓝牙通信、智能显示、节能环保于一体的未来工具。 这款工牌拥有600*4…

电压模式R-2R DAC的工作原理和特性

本文将探讨电压模式R-2R DAC结构。 在本文中&#xff0c;我们将探索什么是R-2R DAC以及如何实现它们。 首先&#xff0c;我们将简要回顾一下开尔文分压器DAC。这种结构很简单&#xff0c;但它们需要大量的电阻和开关来实现高分辨率DAC。这个问题的一个解决方案是称为R-2R DAC…

内核启动时的中断和时钟的初始化流程

总结 内核通过start_kernel从汇编进入c世界&#xff0c;在用serup_arch设置体系架构的时候&#xff0c;会返回当前机器的machine_desc&#xff1b;然后init_IRQ和time_init来初始化中断。时钟子系统 start_kernelsetup_arch(&command_line);mdesc setup_machine_fdt(ata…

用友YonSuite打通招银云直联,让企业收付款更便利

在当今数智化浪潮席卷全球的背景下&#xff0c;企业对于高效、便捷的管理系统需求日益增加。作为全球领先的企业云服务与软件提供商&#xff0c;用友始终站在技术前沿&#xff0c;致力于为成长型企业提供全方位的数智化解决方案。 用友网络与招商银行通过联通双方系统&#xf…

YOLOv8改进 | 卷积模块 | 用坐标卷积CoordConv替换Conv

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a;《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容&#xff0c;内含各种Head检测头、损失函数Loss、B…

消息订阅报错-用户拒绝: errMsg

微信小程序-消息订阅报错 前提问题解决 前提 小程序开发过程中&#xff0c;使用消息订阅功能。 问题 场景一&#xff1a;再注册成功之后进行消息订阅功能。 这里消息订阅功能写在接口请求成功的方法里面。 但是项目运行起来&#xff0c;消息订阅功能并没有被调用起来。 并且…