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

【学习FreeRTOS】第17章——FreeRTOS任务通知

1.任务通知的简介

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

  • 使用队列、信号量、事件标志组时都需另外创建一个结构体,通过中间的结构体进行间接通信!
    在这里插入图片描述
  • 使用任务通知时,任务结构体TCB中就包含了内部对象,可以直接接收别人发过来的"通知"
    在这里插入图片描述

任务通知值的更新方式

  • 不覆盖接受任务的通知值【类似队列不覆写】
  • 覆盖接受任务的通知值【类似队列覆写】
  • 更新接受任务通知值的一个或多个bit【类似任务标志组】
  • 增加接受任务的通知值【类似信号量】
  • 只要合理,灵活的利用任务通知的特点,可以在一些场合中替代队列、信号量、事件标志组!

任务通知的优势及劣势

  • 效率更高(快):使用任务通知向任务发送事件或数据比使用队列、事件标志组或信号量快得多
  • 使用内存更小:使用其他方法时都要先创建对应的结构体,使用任务通知时无需额外创建结构体

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

任务通知有速度快、内存小的优势,但是中断不能收数据,只能一对一,只有一个数据量,发送不支持阻塞。多用于一对一通知

2.任务通知值和通知状态

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

typedef  struct  tskTaskControlBlock 
{//… …#if ( configUSE_TASK_NOTIFICATIONS  ==  1 )volatile  uint32_t	ulNotifiedValue [ configTASK_NOTIFICATION_ARRAY_ENTRIES ];volatile  uint8_t  	ucNotifyState 	[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];endif//… …
} tskTCB;
#define  configTASK_NOTIFICATION_ARRAY_ENTRIES	1  	/* 定义任务通知数组的大小, 默认: 1 */

ulNotifiedValue是 uint32_t 类型,用来表示通知值
ucNotifyState是 uint8_t 类型,用来表示通知状态

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

  • 计数值(数值累加,类似信号量)
  • 相应位置一(类似事件标志组)
  • 任意数值(支持覆写和不覆写,类似队列)

任务通知状态共有3种取值:

#define	taskNOT_WAITING_NOTIFICATION  	( ( uint8_t ) 0 )		 /* 任务未等待通知 */
#define taskWAITING_NOTIFICATION		( ( uint8_t ) 1 )		 /* 任务在等待通知 */
#define taskNOTIFICATION_RECEIVED       ( ( uint8_t ) 2 )		 /* 任务在等待接收 */
  • 任务未等待通知 :任务通知默认的初始化状态
  • 等待通知:接收方已经准备好了(调用了接收任务通知函数),等待发送方给个通知
  • 等待接收:发送方已经发送出去(调用了发送任务通知函数),等待接收方接收

3.任务通知相关API函数介绍

任务通知API函数主要有两类:①发送通知 ,②接收通知。
【注意】发送通知API函数可以用于任务和中断服务函数中;接收通知API函数只能用在任务中。

  • xTaskNotify():发送任务通知,带有通知值
  • xTaskNotifyAndQuery():发送任务通知,带有通知值,保留接收任务原通知值
  • xTaskNotifyGive():发送任务通知,不带通知值
  • xTaskNotifyFromISR():在中断中发送任务通知
  • xTaskNotifyAndQueryFromISR():在中断中发送任务通知
  • vTaskNotifyGiveFromISR():在中断中发送任务通知
  • ulTaskNotifyTake():获取任务通知,可以设置在退出此函数的时候将任务通知值清零或者减一。
  • xTaskNotifyWait():获取任务通知,比 ulTaskNotifyTak()更为复杂,可获取通知值和清除通知值的指定位。

xTaskNotifyAndQuery()和xTaskNotify()常用于模拟写队列/设置标志位,ulTaskNotifyTake()常用于读队列/清除标志位
xTaskNotifyGive()常用于模拟信号量释放,ulTaskNotifyTake()常用于模拟信号量获取
下方的函数和上述的函数基本一致,只不过可以操作下表不为0的元素操作(不常用)
在这里插入图片描述

3.1.发送任务通知

#define	xTaskNotifyAndQuery(xTaskToNotify,  ulValue ,  eAction ,  pulPreviousNotifyValue  )xTaskGenericNotify((xTaskToNotify), (tskDEFAULT_INDEX_TO_NOTIFY), (ulValue), (eAction),	(pulPreviousNotifyValue ))
#define	xTaskNotify(xTaskToNotify ,  ulValue ,  eAction  )xTaskGenericNotify((xTaskToNotify), (tskDEFAULT_INDEX_TO_NOTIFY), (ulValue), (eAction),  NULL)
#define	xTaskNotifyGive(  xTaskToNotify  )xTaskGenericNotify((xTaskToNotify), (tskDEFAULT_INDEX_TO_NOTIFY),  (0), 	  eIncrement, NULL)BaseType_t xTaskGenericNotify(	TaskHandle_t 	xTaskToNotify,UBaseType_t 	uxIndexToNotify,uint32_t 		ulValue,eNotifyAction 	eAction,uint32_t * 		pulPreviousNotificationValue  )typedef  enum
{    eNoAction = 0, 				/* 无操作 */eSetBits					/* 更新指定bit */eIncrement					/* 通知值加一 */eSetValueWithOverwrite		/* 覆写的方式更新通知值 */eSetValueWithoutOverwrite	/* 不覆写通知值 */
} eNotifyAction;
  • 形参xTaskIaNatify:接收任务通知的任务句柄
  • 形参uxIndexToNotify:任务的指定通知(任务通知相关数组成员,第0个元素)
  • 形参ulValue:任务通知值
  • 形参eAction:通知方式(通知值更新方式)
  • 形参pulPreviousNotificationValue:用于保存更新前的任务通知值(为NULL则不保存)

3.2.发送任务通知底层函数xTaskGenericNotify( )解析

在这里插入图片描述

3.3.获取任务通知

#define ulTaskNotifyTake( xClearCountOnExit  ,   xTicksToWait )ulTaskGenericNotifyTake	( ( tskDEFAULT_INDEX_TO_NOTIFY ),//任务的指定通知( xClearCountOnExit ),( xTicksToWait ) ) 
  • 形参uxlndexToWaitQn:任务的指定通知(任务通知相关数组成员)
  • 形参xClearCountOnExit:指定在成功接收通知后,将通知值清零或减1,pdTRUE:把通知值清零;pdEAL.SE:把通知值减一
  • 形参xTicksToWait:阻塞等待任务通知值的最大时间
  • 返回值:0,接收失败;非0,接收成功,返回任务通知的通知值
#define xTaskNotifyWait( 			ulBitsToClearOnEntry,ulBitsToClearOnExit, pulNotificationValue, xTicksToWait)xTaskGenericNotifyWait( 	tskDEFAULT_INDEX_TO_NOTIFY,( ulBitsToClearOnEntry ),( ulBitsToClearOnExit ), ( pulNotificationValue ),( xTicksToWait )) BaseType_t xTaskGenericNotifyWait( 	UBaseType_t 	uxIndexToWaitOn,uint32_t 		ulBitsToClearOnEntry,uint32_t 		ulBitsToClearOnExit,uint32_t * 		pulNotificationValue,TickType_t 		xTicksToWait);
  • 形参uxlndexToWaitOn:任务的指定通知(任务通知相关数组成员)
  • 形参ulBitesToClearOnEntry:等待前清零指定任务通知值的比特位(旧值对应bit清0)
  • 形参ulBitesToClearOnExit:成功等待后清零指定的任务通知值比特位(新值对应bit清0)
  • 形参pulNotificationValue:用来取出通知值(如果不需要取出,可设为NULL)
  • 形参xTicksToWait:阻塞等待任务通知值的最大时间
  • 返回值:pdTRUE,等待任务通知成功;pdFALSE,等待任务通知失败

3.4.ulTaskNotifyTake( )与xTaskNotifyWait( )函数解析

  • ulTaskNotifyTake( )
    在这里插入图片描述
  • ulTaskNotifyTake( )
    在这里插入图片描述

4.任务通知模拟信号量实验

  • 实验目的:学习使用 FreeRTOS 中的任务通知功能模拟二值信号量和计数型信号量
  • 实验设计:将设计三个任务:start_task、task1、task2
    start_task用来创建task1和task2任务
    task1用于按键扫描,当检测到按键KEY0被按下时,将发送任务通知
    task2用于接收任务通知,并打印相关提示信息
    在这里插入图片描述

5.任务通知模拟消息邮箱实验

  • 实验目的:学习使用 FreeRTOS 中的任务通知功能模拟消息邮箱
  • 实验设计:将设计三个任务:start_task、task1、task2
    start_task用来创建task1和task2任务
    task1用于按键扫描,将按下的按键键值通过任务通知发送给指定任务
    task2用于接收任务通知,并根据接收到的数据做相应动作

在这里插入图片描述

6.任务通知模拟事件标志组实验

  • 实验目的:学习使用 FreeRTOS 中的任务通知功能模拟事件标志组
  • 实验设计:将设计三个任务:start_task、task1、task2
    start_task用来创建task1和task2任务
    task1用于按键扫描,当检测到按键按下时,发送任务通知设置不同标志位
    task2用于接收任务通知,并打印相关提示信息

在这里插入图片描述

相关文章:

【学习FreeRTOS】第17章——FreeRTOS任务通知

1.任务通知的简介 任务通知:用来通知任务的,任务控制块中的结构体成员变量 ulNotifiedValue就是这个通知值。 使用队列、信号量、事件标志组时都需另外创建一个结构体,通过中间的结构体进行间接通信! 使用任务通知时&#xff0c…...

GO-vscode远程开发和调试

本文内容主要包括: 概述: 主要就是把代码放到服务器上然后远程去开发和调试 工具: vscode 远程端: linux 一.安装远程插件 vscode安装Remote - SSH,Remote Explorer,Remote Development&#xff0c…...

【笔记】判断两个Double类型的值是否相同

在Java中,将两个double值转换为String类型,然后使用equals方法进行比较是一个常见的做法,但是这种方法并不是完全可靠,特别是在涉及浮点数的精度时仍然可能会遇到问题。 浮点数在内部以二进制表示,有时会存在舍入误差…...

Linux —— nfs文件系统

简介 NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位…...

数据降维 | MATLAB实现T-SNE降维特征可视化

数据降维 | MATLAB实现T-SNE降维特征可视化 目录 数据降维 | MATLAB实现T-SNE降维特征可视化降维效果基本描述程序设计参考资料 降维效果 基本描述 T-SNE降维特征可视化,MATLAB程序。 T-分布随机邻域嵌入,主要用途是对高维数据进行降维并进行可视化&…...

蓝桥杯上岸每日N题 (交换瓶子)

大家好 我是寸铁 希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注 题目描述 有 N 个瓶子,编号 1∼N,放在架子上。 比如有 5 个瓶子: 2 1 3 5 4 要求每次拿起 2 个瓶子,交换它们的位置。 …...

GMS基本模块TIN、Solids、Modflow2000/2005、MT3DMS、MODPATH。及其在地下水流动、溶质运移、粒子追踪方面的应用

解决地下水数值模拟技术实施过程中遇到的困难,从而提出切实可行的环境保护措施,达到有效保护环境、防治地下水污染,推动经济社会可持续发展的目的。 (1)水文地质学,地下水数值模拟基础理论;&am…...

MySQL数据库中间件Mycat介绍及下载安装(教程)

一,介绍 MyCat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。可以像使用MySQL一样来使用MyCat,对于开发人员来说根本感觉不到MyCat的存在。 开发人员只需要连接MyCat即可,而具体底层用到几台数据库,每一台数据库服务器…...

【VMware】CentOS 设置静态IP(Windows 宿主机)

文章目录 1. 更改网络适配器设置2. 配置虚拟网络编辑器3. 修改 CentOS 网络配置文件4. ping 测试结果 宿主机:Win11 22H2 虚拟机:CentOS-Stream-9-20230612.0 (Minimal) 1. 更改网络适配器设置 Win R:control 打开控制面板 依次点击&#x…...

机器学习十大算法之七——随机森林

0 引言 集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个横型,集成所有模型的建模结果,基本上所有的机器学习领域都可以看到集成学习…...

spring boot 3使用 elasticsearch 提供搜索建议

业务场景 用户输入内容&#xff0c;快速返回建议&#xff0c;示例效果如下 技术选型 spring boot 3elasticsearch server 7.17.4spring data elasticsearch 5.0.1elasticsearch-java-api 8.5.3 pom.xml <dependency><groupId>org.springframework.boot</gr…...

住宅IP:解锁更快速、稳定的互联网,你准备好了吗?

随着互联网的广泛普及&#xff0c;我们对网络的需求也越来越高。无论是工作、学习还是娱乐&#xff0c;我们都希望能够享受到更快速、稳定的互联网连接。而在实现这一目标的过程中&#xff0c;住宅IP正逐渐崭露头角&#xff0c;成为了一种备受关注的解决方案。那么&#xff0c;…...

支持dolby vision的盒子接支持dolby vision的电视,在adaptive hdr时,播放非dv的hdr视频,输出sdr

支持dolby vision的盒子接支持dolby vision的电视&#xff0c;setting选择adaptive hdr&#xff0c;按照这个配置在播放非dv的hdr视频时&#xff0c;会输出sdr。 看起来是很不合理的&#xff0c;高级的产品播放高级的片源&#xff0c;却输出低级的画质。 想要搞清楚这个问题&am…...

使用ffmpeg将WebM文件转换为MP4文件的简单应用程序

tiktok网上下载的short视频是webm格式的&#xff0c;有些程序无法处理该程序&#xff0c;比如roop程序&#xff0c;本文介绍了如何使用wxPython库创建一个简单的GUI应用程序&#xff0c;用于将WebM文件转换为MP4文件。这个应用程序使用Python编写&#xff0c;通过调用FFmpeg命令…...

Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”

Prompt任务&#xff08;Prompt Tasks&#xff09; 通过设计提示&#xff08;prompt&#xff09;模板&#xff0c;实现使用更少量的数据在预训练模型&#xff08;Pretrained Model&#xff09;上得到更好的效果&#xff0c;多用于&#xff1a;Few-Shot&#xff0c;Zero-Shot 等…...

玩转Mysql系列 - 第6篇:select查询基础篇

这是Mysql系列第6篇。 环境&#xff1a;mysql5.7.25&#xff0c;cmd命令中进行演示。 DQL(Data QueryLanguage)&#xff1a;数据查询语言&#xff0c;通俗点讲就是从数据库获取数据的&#xff0c;按照DQL的语法给数据库发送一条指令&#xff0c;数据库将按需求返回数据。 DQ…...

【SpringCloud技术专题】「Gateway网关系列」(1)微服务网关服务的Gateway组件的原理介绍分析

为什么要有服务网关? 我们都知道在微服务架构中&#xff0c;系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;难道要一个个的去调用吗&#xff1f;很显然这是不太实际的&#xff0c;我们需要有一个统一的接口与这些微服务打交道&#xf…...

【面试刷题】————STL中的vector是如何实现的?

STL&#xff08;Standard Template Library&#xff09;是C标准库中的一部分&#xff0c;它提供了许多常用的数据结构和算法&#xff0c;其中包括了动态数组 vector。 vector std::vector 是一个动态数组&#xff0c;它能够自动调整自己的大小&#xff0c;以适应存储元素的需…...

使用钉钉的扫码会出现多个回调(DTFrameLogin)

官方&#xff1a;地址 标题 出现的问题解决后效果正常使用(按照官网的流程进行使用)自己的理解(路人可忽略该内容&#xff01;) 出现的问题 1692861955468 解决后效果 1692861665687 正常使用(按照官网的流程进行使用) fn.js 该文件就是钉钉官网的js文件&#xff0c;我下载到了…...

Android | 关于 OOM 的那些事儿

作者&#xff1a;345丶 前言 Android 系统对每个app都会有一个最大的内存限制&#xff0c;如果超出这个限制&#xff0c;就会抛出 OOM&#xff0c;也就是Out Of Memory 。本质上是抛出的一个异常&#xff0c;一般是在内存超出限制之后抛出的。最为常见的 OOM 就是内存泄露(大量…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...