【学习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就是这个通知值。 使用队列、信号量、事件标志组时都需另外创建一个结构体,通过中间的结构体进行间接通信! 使用任务通知时,…...
GO-vscode远程开发和调试
本文内容主要包括: 概述: 主要就是把代码放到服务器上然后远程去开发和调试 工具: vscode 远程端: linux 一.安装远程插件 vscode安装Remote - SSH,Remote Explorer,Remote Development,…...
【笔记】判断两个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 提供搜索建议
业务场景 用户输入内容,快速返回建议,示例效果如下 技术选型 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:解锁更快速、稳定的互联网,你准备好了吗?
随着互联网的广泛普及,我们对网络的需求也越来越高。无论是工作、学习还是娱乐,我们都希望能够享受到更快速、稳定的互联网连接。而在实现这一目标的过程中,住宅IP正逐渐崭露头角,成为了一种备受关注的解决方案。那么,…...
支持dolby vision的盒子接支持dolby vision的电视,在adaptive hdr时,播放非dv的hdr视频,输出sdr
支持dolby vision的盒子接支持dolby vision的电视,setting选择adaptive hdr,按照这个配置在播放非dv的hdr视频时,会输出sdr。 看起来是很不合理的,高级的产品播放高级的片源,却输出低级的画质。 想要搞清楚这个问题&am…...
使用ffmpeg将WebM文件转换为MP4文件的简单应用程序
tiktok网上下载的short视频是webm格式的,有些程序无法处理该程序,比如roop程序,本文介绍了如何使用wxPython库创建一个简单的GUI应用程序,用于将WebM文件转换为MP4文件。这个应用程序使用Python编写,通过调用FFmpeg命令…...
Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”
Prompt任务(Prompt Tasks) 通过设计提示(prompt)模板,实现使用更少量的数据在预训练模型(Pretrained Model)上得到更好的效果,多用于:Few-Shot,Zero-Shot 等…...
玩转Mysql系列 - 第6篇:select查询基础篇
这是Mysql系列第6篇。 环境:mysql5.7.25,cmd命令中进行演示。 DQL(Data QueryLanguage):数据查询语言,通俗点讲就是从数据库获取数据的,按照DQL的语法给数据库发送一条指令,数据库将按需求返回数据。 DQ…...
【SpringCloud技术专题】「Gateway网关系列」(1)微服务网关服务的Gateway组件的原理介绍分析
为什么要有服务网关? 我们都知道在微服务架构中,系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?难道要一个个的去调用吗?很显然这是不太实际的,我们需要有一个统一的接口与这些微服务打交道…...
【面试刷题】————STL中的vector是如何实现的?
STL(Standard Template Library)是C标准库中的一部分,它提供了许多常用的数据结构和算法,其中包括了动态数组 vector。 vector std::vector 是一个动态数组,它能够自动调整自己的大小,以适应存储元素的需…...
使用钉钉的扫码会出现多个回调(DTFrameLogin)
官方:地址 标题 出现的问题解决后效果正常使用(按照官网的流程进行使用)自己的理解(路人可忽略该内容!) 出现的问题 1692861955468 解决后效果 1692861665687 正常使用(按照官网的流程进行使用) fn.js 该文件就是钉钉官网的js文件,我下载到了…...
Android | 关于 OOM 的那些事儿
作者:345丶 前言 Android 系统对每个app都会有一个最大的内存限制,如果超出这个限制,就会抛出 OOM,也就是Out Of Memory 。本质上是抛出的一个异常,一般是在内存超出限制之后抛出的。最为常见的 OOM 就是内存泄露(大量…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

