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

【FreeRTOS基础入门】任务通知

文章目录

  • 前言
  • 一、任务通知介绍
    • 1.1 任务通知怎么通信
    • 1.2 任务通知与其他通信方式的区别
    • 1.3 优势及限制
      • 任务通知的优势
      • 任务通知的限制
    • 1.4 内部原理
  • 二、任务通知的使用
    • 2.1 发出与接收通知简化版
    • 2.1 发出与接收通知专业版
  • 总结


前言

FreeRTOS 提供了丰富而灵活的任务通知机制,为多任务协作提供了一种有效的方式。任务通知允许任务之间进行轻量级的信息传递,从而实现更加紧密的协同工作。在本篇文章中,我们将深入了解 FreeRTOS 中的任务通知,探索其基础概念和简单用法,帮助读者更好地理解和应用这一关键特性。


一、任务通知介绍

1.1 任务通知怎么通信

在任务通知中,我们可以直接把需要通知的东西发给对方就行了:
在这里插入图片描述

1.2 任务通知与其他通信方式的区别

使用队列、信号量、事件组时,我们都要事先创建对应的结构体,双方通过中间的结构体通信:
在这里插入图片描述
但我们的任务通知只需要对方的TCB结构体即可任务结构体 TCB 中就包含了内部对象,可以直接接收别人发过来的"通知":
在这里插入图片描述

1.3 优势及限制

任务通知的优势

 效率更高:使用任务通知来发送事件、数据给某个任务时,效率更高。比队列、信号量、事件组都有大的优势。
 更节省内存:使用其他方法时都要先创建对应的结构体,使用任务通知时无需额外创建结构体。

任务通知的限制

 不能发送数据给 ISR:
ISR 并没有任务结构体,所以无法使用任务通知的功能给 ISR 发送数据。但是 ISR可以使用任务通知的功能,发数据给任务。
 数据只能给该任务独享
使用队列、信号量、事件组时,数据保存在这些结构体中,其他任务、ISR 都可以访问这些数据。使用任务通知时,数据存放入目标任务中,只有它可以访问这些数据。
在日常工作中,这个限制影响不大。因为很多场合是从多个数据源把数据发给某个任务,而不是把一个数据源的数据发给多个任务。
 无法缓冲数据
使用队列时,假设队列深度为 N,那么它可以保持 N 个数据。使用任务通知时,任务结构体中只有一个任务通知值,只能保持一个数据。
 无法广播给多个任务
使用事件组可以同时给多个任务发送事件。使用任务通知,只能发个一个任务。
 如果发送受阻,发送方无法进入阻塞状态等待假设队列已经满了,使用 xQueueSendToBack()给队列发送数据时,任务可以进入阻塞状态等待发送完成。使用任务通知时,即使对方无法接收数据,发送方也无法阻塞等待,只能即刻返回错误

1.4 内部原理

在TCB_t里面,存储着这两个成员:ulNotifiedValueucNotifyState他们分别表示通知的数据和通知的状态,如下图所示:
在这里插入图片描述
通知状态有 3 种取值:
 taskNOT_WAITING_NOTIFICATION:任务没有在等待通知
 taskWAITING_NOTIFICATION:任务在等待通知
 taskNOTIFICATION_RECEIVED:任务接收到了通知,也被称为 pending(有数据了,待处理)

通知值可以有很多种类型:
 计数值
 位(类似事件组)
 任意数值

二、任务通知的使用

如果你想使用任务通知,应该加上:configUSE_TASK_NOTIFICATIONS这个宏

任务通知有 2 套函数,简化版、专业版,列表如下:
 简化版函数的使用比较简单,它实际上也是使用专业版函数实现的
 专业版函数支持很多参数,可以实现很多功能

2.1 发出与接收通知简化版

在任务中发送通知可以使用下面这个函数:

BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );

他的参数是任务的handle。他会使对方任务的通知值加1,并使得通知状态变为"pending",也就是 taskNOTIFICATION_RECEIVED,表示有数据了、待处理

在中断中发送通知可以使用下面这个函数:

void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken );

我们可以使用下面这个函数来等待接收通知:

uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );

参数1为是否清除值,在退出此函数之后.参数2为等待时间

 如果通知值等于 0,则阻塞(可以指定超时时间)
 当通知值大于 0 时,任务从阻塞态进入就绪态

2.1 发出与接收通知专业版

在任务中发送通知可以使用下面这个函数:

BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );

参数2为你要为那个任务的TCB的value设置为多少。
eNotifyAction 参数说明:

  1. eNoAction 仅仅是更新通知状态为"pending",未使用 ulValue。这个选项相当于轻量级的、更高效的二进制信号量。
  2. eSetBits 通知值 = 原来的通知值 | ulValue,按位或。相当于轻量级的、更高效的事件组。
  3. eIncrement 通知值 = 原来的通知值 + 1,未使用 ulValue。相当于轻量级的、更高效的二进制信号量、计数型信号量。相当于 xTaskNotifyGive()函数。eSetValueWithoutOverwrite 不覆盖。如果通知状态为"pending"(表示有数据未读),则此次调用 xTaskNotify 不做任何事,返回 pdFAIL。如果通知状态不是"pending"(表示没有新数据),则:通知值 = ulValue。
  4. eSetValueWithOverwrite 覆盖。无论如何,不管通知状态是否为"pendng",通知值 = ulValue。

在中断中发送通知可以使用下面这个函数:

BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, 
eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );

我们可以使用下面这个函数来等待通知:

BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, 
uint32_t *pulNotificationValue, TickType_t xTicksToWait );

参数1为:在 xTaskNotifyWait 入口处,要清除通知值的哪些位?通知状态不是"pending"的情况下,才会清除。
参数2为:在 xTaskNotifyWait 出口处,如果不是因为超时推出,而是因为得到了数据而退出时:通知值 = 通知值 & ~(ulBitsToClearOnExit)。
参数3用来取得对应的值
参数4为等待时间


总结

任务通知是 FreeRTOS 中一个强大的工具,为多任务系统中的任务间通信提供了高效可靠的机制。通过任务通知,任务可以在不同的优先级下进行快速的同步和信息传递,避免了使用更为复杂的信号量和队列时可能引入的开销。了解和善用任务通知,可以让我们更好地设计和优化 FreeRTOS 应用程序,提高系统的效率和可维护性。

在使用任务通知时,需要注意合理规划任务间的通信和同步需求,避免过度使用通知,以确保系统的可靠性。通过深入学习 FreeRTOS 的任务通知机制,我们可以更加灵活地掌握多任务编程的技巧,提高嵌入式系统的性能和响应能力。

在日益复杂的嵌入式应用中,任务通知作为 FreeRTOS 提供的重要特性,为开发者提供了更多处理任务间协作的选择。通过深入理解和应用任务通知,我们能够更加高效地构建稳定可靠的嵌入式系统。希望本文能够为初学者提供一个简明易懂的入门指南,帮助读者更好地利用 FreeRTOS 的任务通知功能。

相关文章:

【FreeRTOS基础入门】任务通知

文章目录 前言一、任务通知介绍1.1 任务通知怎么通信1.2 任务通知与其他通信方式的区别1.3 优势及限制任务通知的优势任务通知的限制 1.4 内部原理 二、任务通知的使用2.1 发出与接收通知简化版2.1 发出与接收通知专业版 总结 前言 FreeRTOS 提供了丰富而灵活的任务通知机制&a…...

python opencv比较图片相似度

目录 一:均值哈希算法 二:三直方图算法 三:单通道直方图 一:均值哈希算法 均值哈希算法是一种快速比较图像相似度的方法。它首先将图像转化为灰度图像,然后计算图像的均值,接着将每个像素的...

校园兼职|大学生校园兼职小程序|基于微信小程序的大学生校园兼职系统设计与实现(源码+数据库+文档)

大学生校园兼职小程序目录 目录 基于微信小程序的大学生校园兼职系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户​微信端功能模块​ 2、管理员服务端功能模块 (1) 兼职管理 (2)论坛管理 (3&…...

linux系统离线安装docker服务教程

1、下载、上传docker-20.10.0.tgz压缩包至服务器,其中,docker下载地址https://download.docker.com/linux/static/stable/x86_64/ 2、新建安装docker脚本docker-install.sh #!/usr/bin/env bash tar -xvf docker-20.10.0.tgzcp docker/* /usr/bin/cat …...

【青龙】快速搭建青龙面板,部署属于你自己的应用!

青龙面板是一个支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台。 废话不多说,直接开始。 这里使用一台 雨云 的云服务器作为演示。雨云注册地址:https://www.rainyun.com/ 优惠码:lz932 使用优惠码注册后绑定微信可获得8折…...

shell脚本实现Mysql分库分表备份

一.数据库的分库分表? 12张图把分库分表讲的明明白白!阿里面试:我们为什么要分库分表https://mp.weixin.qq.com/s?__bizMzU0OTE4MzYzMw&mid2247547792&idx2&sn91a10823ceab0cb9db26e22783343deb&chksmfbb1b26eccc63b784879…...

【算法 - 动态规划】从零开始学动态规划!(总纲)

动态规划 动态规划(Dynamic Programming,DP)是一种优化问题求解方法,通常用于解决具有 重叠子问题 和 最优子结构 性质的问题。它的基本思想是将原问题分解成更小的子问题,通过求解和保存这些子问题的解,避…...

从 Elasticsearch 到 Apache Doris,统一日志检索与报表分析,360 企业安全浏览器的数据架构升级实践

导读:随着 360 企业安全浏览器用户规模的不断扩张,浏览器短时间内会产生大量的日志数据。为了提供更好的日志数据服务,360 企业安全浏览器设计了统一运维管理平台,并引入 Apache Doris 替代了 Elasticsearch,实现日志检…...

【力扣 - 二叉树的直径】

题目描述 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 提示: 树中节点数目在范围 [1, 10000] 内…...

大数据,对于生活的改变

谷歌通过对于疾病的查询量可以预测一个个h1n1病毒的大爆发, 大数据时代对于人的考验 用户的搜索记录就是一种信息,这种信息会满足其基础相关的词条与其有关的词条(最为原始的搜索机制,国内的搜索引擎都是采用这种基础原理。&…...

py2neo和neo4j

py2neo 和 neo4j 是两个 Python 中与 Neo4j 图数据库交互的库,但它们有不同的设计和使用方式。 py2neo: 类型: py2neo 是一个面向对象的库,提供了一个对象模型,使得与 Neo4j 数据库的交互更加 Pythonic。API 风格: 使用 Node 和 Relationship…...

解决windows无法访问wsl下docker服务

笔者在初学使用wsl跑docker时,遇到了windows无法访问的问题,并且浏览了大部分的文章,发现并没有起效,在反复试错终于成功之后,总结为以下几点: 1.升级至wsl2 2.将.wslconfig文件(用户文件夹下)中的如下镜像服务关闭删除 networkingModemirrored 3.打开wsl防火墙相应的端口 …...

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(二)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型,由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”(そら sora),即天空之意,以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…...

Python第十九章(模块)

系统的模块库一般处于外部库中的Lib里面 一。导入模块的方式: 1.方式一: 导入:import 模块名1,模块名2 调用:模块名 . 功能名() 2.方式二: 导入:from 模块名 import 功能1,功能…...

【Linux网络编程五】Tcp套接字编程(四个版本服务器编写)

【Linux网络编程五】Tcp套接字编程(四个版本服务器编写) [Tcp套接字编程]一.服务器端进程:1.创建套接字2.绑定网络信息3.设置监听状态4.获取新连接5.根据新连接进行通信 二.客户端进程:1.创建套接字2.连接服务器套接字3.连接成功后进行通信 三…...

APP 有漏洞被测要下架,怎么处理?

事情的经过是这样的: 1:学员公司测试的 APP 发现有漏洞,被要求下架 2:他被公司要求去查询 APP 哪里有漏洞 3:他来寻求帮助,推荐几款安全测试扫描漏洞的问题。 事情的梳理: 1:我们看了他的 …...

2024年2月19日-2月25日(全面进行+收集免费虚幻商城资源)

试试周一到周五重点进行,周末抄写源码,周一晚上看书很快就在22:00睡着,早上可以看看视频教程,出租车上补觉。 执行如下: 周一: 8:01-9:20ue4 rpg(184&#xf…...

Flutter学习4 - Dart数据类型

1、基本数据类型 num、int、double (1)常用数据类型 num类型,是数字类型的父类型,有两个子类 int 和 double 通过在函数名前加下划线,可以将函数变成私有函数,私有函数只能在当前文件中调用 //常用数据…...

leetcode hot100单词拆分

在本题中,我们是要把一个字符串,判断是否能用给的字符串数组中的单词进行拆分,如果可以则返回true,不能的话则返回false。这个题一开始看无法与背包问题联系在一起。但仔细考虑,就是用物品(给的字符串数组中…...

大数据构建知识图谱:从技术到实战的完整指南

文章目录 大数据构建知识图谱:从技术到实战的完整指南一、概述二、知识图谱的基础理论定义与分类核心组成历史与发展 三、知识获取与预处理数据源选择数据清洗实体识别 四、知识表示方法知识表示模型RDFOWL属性图模型 本体构建关系提取与表示 五、知识图谱构建技术图…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...