十八、FreeRTOS之FreeRTOS任务通知

本节需要掌握以下内容:

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

七、课堂总结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JOSEF约瑟 接触式中间继电器 JZC1-53 AC220V 导轨安装

系列型号 JZC1-22中间继电器;JZC1-44中间继电器; JZC1-62中间继电器;JZC1-80中间继电器; JZC1-71中间继电器;JZC1-53中间继电器; JZC1-32中间继电器;JZC1-40中间继电器; JZC1-31中间…

HarmonyOS4.0从零开始的开发教程10Video组件的使用

HarmonyOS(九)Video组件的使用 概述 在手机、平板或是智慧屏这些终端设备上,媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集,还是视频的播放、切换、循环,亦或是相机的预览、拍照等功能…

【Python】翻译包translate

在Python里,可以用translate包完成语言的翻译转化 import translatetrantranslate.Translator(from_lang"ZH",to_lang"JA") strtran.translate("今天的天气怎么样")print(str)

四招打造完美分层自动化测试框架,让测试更高效!

写在前面 我们刚开始做自动化测试,可能写的代码都是基于原生写的代码,看起来特别不美观,而且感觉特别生硬。 来看下面一段代码: 具体表现如下: driver对象在测试类中显示 定位元素的value值在测试类中显示 定位元素…

【Vue+Python】—— 基于Vue与Python的图书管理系统

文章目录 🍖 前言🎶一、项目描述✨二、项目展示🏆三、撒花 🍖 前言 【VuePython】—— 基于Vue与Python的图书管理系统 🎶一、项目描述 描述: 本项目为《基于Vue与Python的图书管理系统》,项目…

【出现模块node_modules里面包找不到】

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 一、出现的问题二、解决办法三、其它可供参考 一、出现的问题 在本地运行 npm run docs:dev之后,出现 Error [ERR_MODULE_NOT_FOUND]: Cannot find package Z:\Blog\docs\node_modules\htmlparser2\ imported from Z:\Blo…

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

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

类的生命周期

加载:通过类的完全限定名,查找此类的二进制字节码文件,利用字节码文件创建Class对象 验证:验证类是否符合JVM规范,安全行检查 文件格式验证、元数据验证、字节码验证。格式检查如:文件格式是否错误、语法是…

【C语言】操作符详解(二)

目录 移位操作符 左移操作符 右移操作符 位操作符:&、|、^、~ 一道面试题 移位操作符 <<左移操作符 >>右移操作符注:移位…

IEEE期刊论文模板

一、模板下载 1、登陆IEEE作者中心Author Center 地址&#xff1a;Publish with IEEE Journals - IEEE Author Center Journals 2、点击“Download a template” 3、在弹出的模板下载页面点击IEEE模板选择器“IEEE Template Selector” 4、在弹出的模板选择器页面点击“Tran…

vivado时序方法检查10

TIMING-41 &#xff1a; 内部管脚上定义的前向时钟无效 前向时钟 <clock_group> 是在管脚 <netlist_element> 上定义的 &#xff0c; 而不是在端口 <netlist_element> 上定义的。 描述 前向时钟是在连接到输出端口的叶节点管脚上定义的 &#xff0c…

计算机毕业设计 基于大数据的心脏病患者数据分析管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Codeforces Round 913 (Div. 3) A~G

A.Rook&#xff08;循环&#xff09; 题意&#xff1a; 给出一个 8 8 8 \times 8 88的棋盘和一个棋子&#xff08;可以任选上下左右四方向移动任意步数&#xff09;&#xff0c;问一次移动可以到达哪些格子。 分析&#xff1a; 使用for循环对棋子所在的行列进行遍历并输出…

【词云图】从excel和从txt文件,绘制以句子、词为单位的词云图

从excel和从txt文件&#xff0c;绘制以句子、词为单位的词云图 写在最前面数据说明&结论 从txt文件&#xff0c;绘制以句子、词为单位的词云图自我介绍 从excel&#xff0c;绘制以句子、词为单位的词云图读取excel绘制以句子、词为单位的词云图文章标题 写在最前面 经常绘…

【已解决】解决Win7虚拟机打开网页报错的情况

因为刚才下载了个虚拟机&#xff0c;同样出现了无法安装VMtools的情况&#xff0c;所以想直接通过虚拟机的浏览器来下载一个补丁&#xff08;因为自己的U盘在虚拟机上面无法识别&#xff0c;应该是太老了Win7&#xff09; 结果发现Win7内置的IE浏览器太拉了。于是向下载一个火…

掌握PyTorch数据预处理(一):让模型表现更上一层楼!!!

引言 在PyTorch中&#xff0c;数据预处理是模型训练过程中不可或缺的一环。通过精心优化数据&#xff0c;我们能够确保模型在训练时能够更高效地学习&#xff0c;从而在实际应用中达到更好的性能。今天&#xff0c;我们将深入探讨一些常用的PyTorch数据预处理技巧&#xff0c;…

前端uniapp知识点总结

1、谈谈你对uni-app的理解 uni-app是一个使用Vue.js开发所有前端应用的框架&#xff0c;真正做到一套代码多端发行。开发者编写一套代码&#xff0c;可以发布到IOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序、快应用等多个平台。Uniapp中&#xff0c;使用…

Nginx的性能优化、安全以及防盗链配置

目录 一、nginx的日志分割 二、nginx性能优化之启用epoll模型 三、nginx性能优化之设置worker进程数并与cpu进行绑核 四、nginx性能优化之调整worker的最大打开文件数和最大处理连接请求数量 五、nginx性能优化之启用gzip压缩&#xff0c;提高传输&#xff0c;减少带宽 六…

自行编写一个简单的shell!

本文旨在编写一个简单的shell外壳程序&#xff01;功能类似于shell的一些基本操作&#xff01;虽然不能全部实现shell的一些功能&#xff01;但是通过此文章&#xff0c;自己写一个简单的shell程序也是不成问题&#xff01;并且通过此文章&#xff0c;可以让读者对linux中一些环…

入门Redis学习总结

记录之前刚学习Redis 的笔记&#xff0c; 主要包括Redis的基本数据结构、Redis 发布订阅机制、Redis 事务、Redis 服务器相关及采用Spring Boot 集成Redis 实现增删改查基本功能 一&#xff1a;常用命令及数据结构 1.Redis 键(key) # 设置key和value 127.0.0.1:6379> set …