十八、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

七、课堂总结

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

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

相关文章

智能无人零售:革新零售消费体验的未来

智能无人零售:革新零售消费体验的未来 在当今数字化时代,智能无人零售正以惊人的速度改变着我们的购物方式和消费体验。这一新兴领域的发展,为消费者带来了前所未有的便利和个性化选择。 智能无人零售是指利用先进的智能技术和自动化系统&…

【面试题:对象引用在内存中存在何处?基于何种计算机原理获取对象的值?】

嗨,小伙伴们!小米在这里啦,今天给大家分享一个超有趣的话题——面试题:对象引用是存在内存哪,基于什么计算机原理获取对象的值?废话不多说,让我们一起深入了解一下这个充满技术魅力的问题吧&…

Java 安全框架shiro初探之一

1.Java安全框架除了spring家族另一个就是shiro框架 不过最近还有一个国产框架很好用:Sa-Token 添加链接描述,想了解的小伙伴可以去look look shiro 官方文档 (https://shiro.apache.org/) 1. 学习教程 参考 (https://www.w3cschool.cn/shiro/) Apac…

2024济南大健康展会,第六届中国国际健康产业博览会5月举办

大力发展全国健康事业 助力健康中国行动战略 DJK 2024第6届中国(济南)国际大健康产业博览会 The 2024 sixth China (Jinan) International Big Health Industry Expo 时间:2024年05月27日—29日 场馆:中国济南黄河国际会展中心 …

JavaScript-节点操作

节点操作 DOM节点 DOM节点:DOM树里每一个内容都称之为节点 节点类型: 元素节点 所有的标签 比如body、divhtml时跟节点 属性节点 所有的属性,比如href 文本节点 所有的文本 其他 查找节点 节点的关系:针对的找亲戚返回的都是…

java_springboot_ssm流浪宠物救助报名管理系统

用户: 注册登录 宠物百科:提供一些养宠物的专业知识、养宠前的注意事项等等 宠物信息:包括宠物图片、品种、性别、年龄、疫苗、领取要求等内容 宠物领养:领养人自己的详细住址、收入情况、有无养过宠物的记录(有则出示…

人工智能原理复习--搜索策略(二)

文章目录 上一篇启发式搜索与或图搜索博弈下一篇 上一篇 人工智能原理复习–搜索策略(一) 启发式搜索 提高一般图搜索效率的关键是优化OPEN表中节点的排序方式 最理想的情况是每次排序OPEN表表首n总在解答路径上 全局排序–对OPEN表中的所有节点进行…

mysql面试题——MVCC

一:什么是MVCC? 多版本并发控制,更好的方式去处理读-写冲突,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。 二&#xff1a…

万界星空科技mes系统中看板管理

我们很多企业现在都有大屏,那到底万界星空科技低代码云mes系统管理中看板管理有什么作用?我总结了几条: 1.提高车间的生产效率 2.有效的监控设备运行状况 3.控制生产线运行 4.增加和改善用户体验 5.提高工作效率和工作安全性

Zabbix监控腾讯云VPC

一、简介 私有网络(Virtual Private Cloud,VPC)是腾讯云上一块由用户自定义的逻辑隔离网络空间,为云服务器、云数据库等资源提供安全可控的网络环境。通过构建逻辑隔离的、用户自定义配置的网络空间,用户能够提升其云…

WIN11家庭中文版使用ENSP+VirtualBox启动AR失败40错误+未完全关闭hyper-V,以及安装VirtualBox兼容性问题

使用版本:eNSP 1.3.00.100VirtualBox 5.2.44WinPcap_4_1_3Wireshark最新版。 win11系统最好按照上述版本安装,VirtualBox不要安装更高版本,否则可能出现不兼容情况,Wireshark版本要求还好,安装顺序是VirtualBox 5.2.4…

python+pytest接口自动化之参数关联

什么是参数关联? 参数关联,也叫接口关联,即接口之间存在参数的联系或依赖。在完成某一功能业务时,有时需要按顺序请求多个接口,此时在某些接口之间可能会存在关联关系。比如:B接口的某个或某些请求参数是通…

如何利用人工智能+物联网技术实现自动化设备生产

随着科技的发展与行业竞争的日益激烈,制造业也逐渐走向智能化发展。制造业的改革是利用物联网技术和自动化设备,实现生产线的智能化和自适应生产,优化生产流程,提高生产效率和质量,为企业创造更大的价值。 方案概述 智…

Gif表情包怎么用图片制作?一招简单易上手

很多朋友对于gif动图的名字不是很熟悉,但是对于“gif表情包”一定很熟悉吧!在日常网络聊天中经常能见到其的身影,能够调节聊天的气氛。想要制作gif表情包可以使用gif动图在线制作(https://www.gif.cn/)网站-GIF中文网&…

学习Linux(2)-学习Linux命令

Linux目录结构 Linux目录结构-菜鸟教程 /bin:bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot:这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。 /dev :dev 是 De…

Dockerfile文件

什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。 docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Docke…

C语言-字符串操作函数-附加使用方式

文章目录 前言字符串复制-strcpy字符串复制(按照位数)-strncpy字符串比较-strcmp字符串比较(按照位数)-strncmp不区分大小写的字符串比较-strcasecmp不区分大小写的比较(前n位)-strncasecmp字符串按照格式写入-sprintf字符串按照格式和个数写入-snprintf…

JUC包(面试常问)

1. Callable接口 类似于Runnable接口,Runnable描述的任务,不带返回值;Callable描述的任务带返回值。 public class Test {//创建线程,计算12...1000public static void main(String[] args) throws ExecutionException, Interru…

js/jQuery常见操作 之各种语法例子(包括jQuery中常见的与索引相关的选择器)

js/jQuery常见操作 之各种语法例子(包括jQuery中常见的与索引相关的选择器) 1. 操作table常见的1.1 动态给table添加title(指定td)1.1.1 给td动态添加title(含:获取tr的第几个td)1.1.2 动态加工…

每日一练【三数之和】

一、题目描述 15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可…