【学习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用于接收任务通知,并打印相关提示信息

在这里插入图片描述

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

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

相关文章

element-table的动态操作,自动以表格,动态新增行、列,删除行列

灵活的自定义表格行列以及增删改查的操作,右键选中列则是列的删除&#xff0c;效果如下 <template><div class"st-table"><div style"width: 100%"><el-button click"addRow()" type"primary" icon"CircleP…

在CSS中,盒模型中的padding、border、margin是什么意思?

在CSS中&#xff0c;盒模型&#xff08;Box Model&#xff09;是用来描述和布局HTML元素的基本概念。它将每个HTML元素看作是一个矩形的盒子&#xff0c;这个盒子包括了内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&a…

无涯教程-PHP - intval() 函数

PHP 7引入了一个新函数 intdiv()&#xff0c;该函数对其操作数执行整数除法并将该除法返回为int。 <?php$valueintdiv(10,3);var_dump($value);print(" ");print($value); ?> 它产生以下浏览器输出- int(3) 3 PHP - intval() 函数 - 无涯教程网无涯教程网…

【图像分割】实现snake模型的活动轮廓模型以进行图像分割研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

raft算法学习备忘

一致性共识算法 参考:分布式一致性算法应用场景&#xff0c;写了为什么需要共识算法&#xff0c;以及相比于mysql这些主从同步方式的区别。 raft算法简介 一种分布式一致性共识算法的实现方式&#xff0c;机制相比于其它例如paxos来说无论从可读性还是实现机制上要简单很多&…

3种获取OpenStreetMap数据的方法【OSM】

OpenStreetMap 是每个人都可以编辑的世界地图。 这意味着你可以纠正错误、添加新地点&#xff0c;甚至自己为地图做出贡献&#xff01; 这是一个社区驱动的项目&#xff0c;拥有数百万注册用户。 这是一个社区驱动的项目&#xff0c;旨在在开放许可下向每个人提供所有地理数据。…

大数据课程K6——Spark的Shuffle详解

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Spark的定义&&特点&&目的&&优缺点; ⚪ 掌握Spark的相关参数配置; ⚪ 掌握Hadoop的插件配置; 一、Spark Shuffle详解 1. 概述 Shuffle,就是洗牌。之所以…

安防监控平台EasyCVR视频汇聚平台增加首页告警类型的详细介绍

安防监控/视频集中存储/云存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等…

vue3-ts- element-plus新增组件-过滤

新增组件-所有值为空时过滤 <el-form-item label"家庭成员"><divclass"username-box"v-for"(item, index) in form.namelist":key"index"><div>姓名&#xff1a;<el-input v-model"item.name" placeho…

Java异常

异常体系结构Java异常的分类异常处理异常抛出异常声明异常捕获异常处理流程自定义异常 异常体系结构 .Error&#xff1a;指的是Java虚拟机无法解决的严重问题&#xff0c;比如&#xff1a;JVM的内部错误、资源耗尽等&#xff0c;典型代表&#xff1a;StackOverflowError&#…

uniapp-滑块验证组件wo-slider

wo-slider是一款支持高度自定义的滑块验证组件&#xff0c;采用uniapp-vue2编写 采用touchstart、touchmove、touchend事件实现的滑块组件,支持H5、微信小程序&#xff08;其他小程序未试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.…

Docker搭建个人网盘、私有仓库

1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘 [rootlocalhost ~]# docker pull mysql:5.6 [rootlocalhost ~]# docker pull owncloud [rootlocalhost ~]# docker run -itd --name mysql --env MYSQL_ROOT_PASSWORD123456 mysql:5.6 [rootlocalhost ~]# doc…

1267. 统计参与通信的服务器

题目描述&#xff1a; 这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台服务器位于同一行或者同一列&#xff0c;我们就认为它们之间可以进行通信。 请你统计并返回能…

工控机驱动自助检票机,打造轨道交通的智慧未来!

随着城市化进程的加速和人口的不断增长&#xff0c;城市轨道交通建设正日益成为解决交通拥堵、提高交通工作效率的重要举措。然而&#xff0c;仅仅依靠传统的交通设施已经无法满足城市发展的需求&#xff0c;轨道交通智能系统建设成为了不可忽视的发展趋势。 AFC&#xff0c;即…

Git gui教程---第八篇 Git gui的使用 创建一个分支

一般情况下一个主分支下代码稳定的情况下会新建出一个分支&#xff0c;然后在分支上修改&#xff0c;修改完成稳定后再合并到主分支上。 或者几个人合作写一份代码&#xff0c;每个人各一个分支&#xff0c;测试稳定再合并到主分支上。 在git gui选择菜单栏“分支”&#xff0…

Linux之套接字UDP实现网络通信

Linux之套接字UDP实现网络通信 文章目录 Linux之套接字UDP实现网络通信1.引言2.具体实现2.1需要知道的套接字接口1.socket()2.bind()3.recvfrom()4.sendto() 2.2服务器端server.hpp2.3服务器端server.cc2.4客户端Client.cc 1.引言 ​ 套接字(Socket)是计算机网络中实现网络通信…

docker安装clickhouse

安装 docker安装 创建clickhouse目录 mkdir -P /data/clickhouse/datamkdir -P /data/clickhouse/confmkdir -P /data/clickhouse/log 拉取镜像 这里直接拉取最新镜像, 如果需要某个特定版本, 则再拉取的时候指定版本号即可. docker pull clickhouse/clickhouse-server 启动临…

Springboot实现ENC加密

Springboot实现ENC加密 1、导入依赖2、配置加密秘钥&#xff08;盐&#xff09;3、获取并配置密文4、重启项目测试5、自定义前缀、后缀6、自定义加密方式 1、导入依赖 关于版本&#xff0c;需要根据spring-boot版本&#xff0c;自行修改 <dependency><groupId>co…

STM32 CubeMX (第四步Freertos内存管理和CPU使用率)

STM32 CubeMX STM32 CubeMX &#xff08;第四步Freertos内存管理和CPU使用率&#xff09; STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用STM32 CubeMX 库&#xff0c;配置Fr…

java maven项目打jar包发布(精简版)

目录 一、maven打包 二、安装jdk环境 三、安装mysql 四、jar包传输到服务器 一、maven打包 先clean再package target文件夹下面有生成一个jar包 二、安装jdk环境 1、下载jdk cd /usr/local wget https://repo.huaweicloud.com/java/jdk/8u201-b09/jdk-8u201-linux-x64.tar.…