十八、FreeRTOS之FreeRTOS任务通知

news2024/11/20 2:30:12

本节需要掌握以下内容:

1、任务通知的简介(了解)

2、任务通知值和通知状态(熟悉)

3、任务通知相关API函数介绍(熟悉)

4、任务通知模拟信号量实验(掌握)

5、任务通知模拟消息邮箱实验(掌握)

6、任务通知模拟事件标志组实验(掌握)

7、课堂总结(掌握)

一、任务通知的简介(了解)

1.1 任务通知的相关概念

任务通知:用来通知任务的,任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。

(队列、信号量、事件标志组也可以用来通知任务。队列可以往其它任务发数据,信号量同样发送一个资源,释放信号量,另外一个任务获取信号量,事件标志组把某一位置一,另一个任务就来读这个位是不是1。这些都能用来通知任务,为什么我们还要用任务通知呢?

最主要的是:内存消耗比较小,因为队列、信号量、事件标志组使用之前都要提前创建好,才能去操作它,而任务通知就不用去创建,因为它的结构体成员就在任务控制块TCB里面。

每创建一个任务就会给这个任务的任务控制块分配个内存,任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。而任务创建好之后,这个结构体成员变量就被创建好了)

  • 使用队列、信号量、事件标志组时都需创建一个结构体,通过中间的结构体进行间接通信!

 使用队列/信号量/事件标志组时发送数据,就是把发送数据放在队列/信号量/事件标志组的结构体中,接收也是从队列/信号量/事件标志组的结构体中读出来。

  • 使用任务通知时,任务结构体TCB中就包含了内部对象,可以直接接收别人发过来的“通知”

发送的时候实际就是任务一直接去操作任务二 任务控制块中的 结构体成员变量ulNotifiedValue,给这个成员写一个值,接收的时候就直接去读这个值。

 任务通知值的更新方式

  • 不覆盖接受任务的通知值(这个结构体数据成员有数值就不写进去,没有数值的时候才写进去)
  • 覆盖接受任务的通知值(不管有没有数值,都能写进去)
  • 更新接受任务通知值的一个或多个bit
  • 增加接受任务的通知值

只要合理、灵活的利用任务通知的特点,可以在一些场合中替代队列、信号量、时间标志组!

1.2 任务通知的优势及劣势

任务通知的优势:

  • 效率更高:使用任务通知向任务发送时间或数据比使用队列、时间标志组或信号快得多(freeRTOS官方也是做了一个测试,使用任务通知来模拟二值信号量这样的一个方式来解除任务的阻塞事件,相对于常规的二值信号量,快了45%)
  • 使用内存更小:使用其它方法时都要创建对应的结构体,使用任务通知时无需额外创建结构体

任务通知的劣势:

  • 无法发送数据给ISR:ISR没有任务结构体,所以无法给ISR发送数据。但是ISR可以使用任务通知的功能,发数据给任务。(发送可以不能接收)
  • 无法广播给多个任务:任务通知只能是被指定的一个任务接受并处理
  • 无法缓存多个数据:任务通知时通过更新任务通知值来发送数据的,任务结构体中只有一个任务通知值,只能一个数据。(队列的话,只要有m个队列项就保存m个数据)
  • 发送受阻不支持阻塞:发送方无法进入阻塞状态等待(队列已满,可以阻塞)

二、任务通知值和通知状态

任务都有一个结构体:任务控制块TCB,它里边有两个结构体成员变量:

  • 一个是uint32_t类型,用来表示通知值
  • 一个是uint8_t类型,用来表示通知状态

2.1 任务通知值

任务通知值的更新方式有多种类型:

  • 计数值(发送一次任务通知值更新,数值类型累加,类似信号量)
  •  相应位置一(发送一次任务通知值更新,相应位置一,类似事件标志组)
  • 任意数值(支持覆写和不覆写,类似队列)

2.2 任务通知状态

其中任务通知状态共有三种值:

  •  任务未等待通知:任务通知默认的初始化状态
  • 等待通知:接收方已经准备好了(调用了接收任务通知函数),等待发送放给个通知
  • 等待接收:发送方已经发送出去了(调用了发送任务通知函数),等待接收方接收

三、任务通知相关API函数介绍(介绍)

任务通知API函数主要有两类:①发送通知,②接收通知。

注意:发送通知API函数可以用于任务和中断服务函数中;接收通知API函数只能用在任务中。(因为中断没有任务控制块这个结构体)

3.1 发送通知相关API函数:

函数

描述

xTaskNotify()

发送通知,带有通知值

xTaskNotifyAndQuery()

发送通知,带有通知值并且保留接收任务的原通知值

xTaskNotifyGive()

发送通知,不带通知值

xTaskNotifyFromISR()

在中断中发送任务通知

xTaskNotifyAndQueryFromISR()

vTaskNotifyGiveFromISR()

 在任务中发送通知的3个API函数原型如下所示,可以看到内部都是都是调用的xTaskGenericNotity()函数,唯一的区别就是带入的入口参数有去区别

 

xTaskGenericNotity()函数参数 如下:

形参

描述

xTaskToNotify

接收任务通知的任务句柄

uxIndexToNotify

任务的指定通知(任务通知相关数组成员)

ulValue

任务通知值

eAction

通知方式(通知值更新方式)

pulPreviousNotificationValue

用于保存更新前的任务通知值(为NULL则不保存)

 任务通知方式共有以下几种:

 3.2 接收通知相关API函数:

函数

描述

ulTaskNotifyTake()

获取任务通知,可以设置在退出此函数的时候将任务通知值清零或者减一。

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

xTaskNotifyWait()

获取任务通知,比 ulTaskNotifyTak()更为复杂,可获取通知值和清除通知值的指定位

总结: 

  • 当任务通知用作于信号量时,使用函数获取信号量:ulTaskNotifyTake()
  • 当任务通知用作于事件标志组或队列时,使用此函数来获取: xTaskNotifyWait()
3.2.1 任务通知用作于信号量ulTaskNotifyTake()

 此函数用于接收任务通知值,可以设置在退出此函数的时候将任务通知值清零或者减一

形参

描述

uxIndexToWaitOn

任务的指定通知(任务通知相关数组成员)

xClearCountOnExit

指定在成功接收通知后,将通知值清零或减 1

pdTRUE:把通知值清零;pdFALSE:把通知值减一

xTicksToWait

阻塞等待任务通知值的最大时间

返回值

描述

0

接收失败

0

接收成功,返回任务通知的通知值

3.2.2 任务通知用作于事件标志组或队列 xTaskNotifyWait()

 此函数用于获取通知值和清除通知值的指定位值,适用于模拟队列和事件标志组,使用该函数来获取任务通知。

形参

描述

uxIndexToWaitOn

任务的指定通知(任务通知相关数组成员)

ulBitesToClearOnEntry

等待前清零指定任务通知值的比特位(旧值对应bit0

ulBitesToClearOnExit

成功等待后清零指定的任务通知值比特位(新值对应bit0

pulNotificationValue

用来取出通知值(如果不需要取出,可设为NULL

xTicksToWait

阻塞等待任务通知值的最大时间

返回值

描述

pdTRUE

等待任务通知成功

pdFALSE

等待任务通知失败

 四、任务通知模拟信号量实验(掌握)

4.1、实验目的:

学习 FreeRTOS 的任务通知功能模拟二值信号量和计数型信号量

4.2、实验设计:

将设计三个任务:start_task、task1、task2

三个任务的功能如下:

  • start_task:用来创建task1和task2任务
  • task1:用于按键扫描,当检测到按键KEY0被按下时,将发送任务通知
  • task2:用于接收任务通知,并打印相关提示信息

4.3 实验代码

demo.c

五、任务通知模拟信息邮箱实验(掌握)

5.1、实验目的:

学习 FreeRTOS 的任务通知功能模拟消息邮箱

5.2、实验设计:

将设计三个任务:start_task、task1、task2

三个任务的功能如下:

  • start_task:用来创建task1和task2任务
  • task1:用于按键扫描,将按下的按键键值通过任务通知发送给指定任务
  • task2:用于接收任务通知,并根据接收到的数据做相应动作

5.3 实验代码

demo.c

代码明天更新

六、任务通知模拟时间标志组实验(掌握)

6.1、实验目的:

学习 FreeRTOS 的任务通知功能模拟事件标志组

6.2、实验设计:

将设计三个任务:start_task、task1、task2

三个任务的功能如下:

  • start_task:用来创建task1和task2任务
  • task1:用于按键扫描,当检测到按键按下时,发送任务通知设置不同标志位
  • task2:用于接收任务通知,并打印相关提示信息

6.3 实验代码

demo.c

七、课堂总结

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

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

相关文章

第一课【习题】使用DevEco Studio高效开发

用哪一种装饰器修饰的组件可作为页面入口组件 ArkTS Stage模型支持API Version 9,关于其工程目录结构说法正确的是? 4. DevEco Studio提供模拟器供开发者运行和调试HarmonyOS应用/服务,以下说法错误的是? DevEco Studio支持使…

2023年9月8日 Go生态洞察:gopls的扩展与Go生态系统的成长

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Qt之实现文字滚动效果

一.效果 二.实现 roller.h #ifndef ROLLER_H #define ROLLER_H#include <QWidget> #include <QPaintEvent> #include <QShowEvent> #include <QHideEvent> #include <QTimer>class Roller : public QWidget { public:explicit Roller(QWidget …

git标签的管理与思考

git 标签管理 git 如何打标签呢&#xff1f; 标签是什么? 标签 相当于一个 版本管理的一个贴纸&#xff0c;随时 可以通过标签 切换到 这个版本的状态 &#xff0c; 有人可能有疑问 git commit 就可以知道 代码的改动了&#xff0c; 为啥还需要标签来管理呢&#xff1f; …

建行驻江门市分行纪检组以廉政家访助推廉洁家风

为强化员工行为管理&#xff0c;深入了解员工的家庭情况以及员工8小时以外的生活&#xff0c;近日&#xff0c;建行驻江门市分行纪检组组长带队对两名青年纪检员开展廉政家访。 驻行纪检组组长亲切问候并访谈了青年纪检员的家庭成员&#xff0c;详细了解其家庭生活情况&#x…

【QED】小樱的问题

目录 题目描述输入格式输出格式 测试样例样例说明 思路核心代码 题目描述 在 f u f u fufu fufu乐园&#xff0c;每天都会有各种各样精彩的内容发生。就比如说&#xff0c;今天&#xff0c;小樱的米饭店开张啦&#xff01; 为了吸引 f u f u fufu fufu们前来购买小樱的大米&a…

来自bioBakery Lab的宏基因组学微生物群落的代谢功能分析工具-HUMAnN 3.0的安装配置及分析使用方法-安装填坑

HUMAnN 3.0 简介&#xff1a; HUMAnN 3.0 是一个用于宏基因组数据分析的工具&#xff0c;能够从宏基因组测序数据中推断出微生物群落的代谢功能信息。它可以识别微生物群落中存在的代谢途径&#xff0c;并定量这些通路的丰度。HUMAnN 3.0 依赖于多个工具和数据库来实现这些功能…

validateEmail

邮箱验证 validateEmail /*** 邮箱验证* * author ZengWenFeng* email 117791303QQ.com* mobile 13805029595* date 2016.08.09*/private static final Pattern PATTERN_EMAIL Pattern.compile("^[_A-Za-z0-9-\\](\\.[_A-Za-z0-9-])*" "[A-Za-z0-9-](\\.[A-Z…

【数电笔记】56-消抖开关

目录 说明&#xff1a; 1. 按键抖动形成的原因 2. 按键消抖的方法 3. 用与非RS触发器构成消抖开关&#xff08;硬件消抖&#xff09; 说明&#xff1a; 笔记配套视频来源&#xff1a;B站本系列笔记并未记录所有章节&#xff0c;只对个人认为重要章节做了笔记&#xff1b;标…

抖去推--短视频剪辑、矩阵无人直播saas营销工具一站式开发

抖去推是一款短视频剪辑和矩阵无人直播SAAS营销工具一站式开发平台。它提供了以下功能和特点&#xff1a; 1. 短视频剪辑&#xff1a;抖去推提供了一系列的剪辑工具&#xff0c;包括自动剪辑、特效制作、配音配乐等&#xff0c;可以帮助用户轻松制作出高质量的短视频。 2. 矩阵…

npm : 无法加载文件 D:\nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本。

今天在使用vscode下载项目的依赖时&#xff0c;输入 pnmp install,结果报错: npm : 无法加载文件 D:\nodejs\node_global\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。原因&#xff1a; 因为在此系统上禁止运行脚本&#xff0c;也就是说没有权限&#xff0c;查一下&#…

两年外包生涯做完,感觉自己废了一半。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

【Java基础篇 | 面向对象】—— 聊聊什么是接口(下篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 上篇&#xff08;【Ja…

船舶机电设备智能故障诊断系统

1 船舶电气设备故障诊断专家系统 体系结构 整个系统的体系结构采用浏览器&#xff0f; 服务器 &#xff08;B&#xff0f; S&#xff09; 三层体系结构 &#xff08; 如图 1 所示 &#xff09;。B&#xff0f;S 模式是一种 以 Web 技术为基础的系统平台模式 。 把传统…

LeetCode刷题--- 求根节点到叶节点数字之和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…

协同过滤算法springboot+java+ssm高校图书馆图书借阅管理系统k32vr

课题主要分为四大模块&#xff1a;即管理员模块&#xff0c;员工模块&#xff0c;教师模块和学生模块&#xff0c;主要功能包括&#xff1a;首页&#xff0c;个人中心&#xff0c;员工管理&#xff0c;学生管理&#xff0c;教师管理&#xff0c;图书分类管理&#xff0c;图书信…

交通|车辆路径启发式中的分解策略

推文作者&#xff1a;Amiee&#xff0c;研究方向&#xff1a;交通物流 编者按&#xff1a; VRP问题由于其理论难度和实践价值&#xff0c;学者们设计了大量的精确或启发式求解算法。本文讨论了车辆路径启发式中分解技术的主要特征&#xff0c;强调了它们的优缺点&#xff0c;并…

唱响主旋律——建行江门市分行推动服务实体经济高质量发展

建行江门市分行主动对接当地战略部署&#xff0c;在侨乡热土踏歌而行&#xff0c;全力当好服务实体经济的主力军和维护金融稳定的压舱石&#xff0c;在助力再造一个现代化新江门上贡献建行力量。 输血实体 为实体经济服务是金融的天职。建行江门市分行积极发挥在重大基建领域…

爱智EdgerOS之深入解析如何应用爱智的视频流模块完成拉流

一、ONVIF 规范和常见视频流传输协议 ① ONVIF 规范 随着视频监控产业链的成熟&#xff0c;市面上陆陆续续出现了各式各样的网络摄像设备&#xff0c;这些设备都需要通讯协议才能进行数据传输。早期厂商都采用私有协议&#xff0c;但是现在厂商分工明确&#xff0c;有的负责生…

用Rust刷LeetCode之26 删除有序数组中的重复项

26. 删除排序数组中的重复项[1] 难度: 简单 老的描述: 新的描述: 注意是 排序数组,非严格递增排列,即已经是排好序的,只不过有重复元素 func removeDuplicates(nums []int) int { if len(nums) 0 { return 0 } i : 0 for j : 1; j < len(nums); j { …