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

FreeRTOS任务通知 | FreeRTOS十二

目录

说明:

一、任务通知

1.1、什么是任务通知

1.2、任务通知优势与劣势

1.3、任务通知值的更新方式

1.4、任务通知值状态

1.5、任务通知状态

1.6、任务通知方式类型

二、任务通知相关API函数

2.1、常用的发送通知API函数

2.2、带通知值的发送通知函数

2.3、常用的接收通知API函数

2.4、ulTaskGenericNotifyTake函数

2.5、xTaskGenericNotifyWait函数

2.6、最佳使用场合


说明:

关于内容:

    1)以下内容多为概念了解与步骤分析

    2)暂无个人示例代码,使用的是FreeRTOS的官方示例代码

    3)若想移植代码测试的,请移步其它地方寻找,下文内容暂无个人示例代码供测试

关于其它:

    1)操作系统:win 10

    2)平台:keil 5 mdk

    3)语言:c语言

    4)板子:STM32系列移植FreeRTOS
 

一、任务通知

1.1、什么是任务通知

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

1.2、任务通知优势与劣势

优势:

        1)效率更高,使用任务通知向任务发送事件或数据比使用队列、事件标志组或信号量快得多;

        2)使用内存小,使用其他方法都需要创建对应的结构体,使用任务通知无需创建结构体。

劣势:

        1)无法发送数据给ISR(中断),ISR没有结构体(通过结构体成员ulNotifiedValue),所以无法给ISR发送数据。但ISR可以使用任务通知,给任务发送数据;

        2)无法广播多个任务,任务通知只能给指定的一个任务接收并处理;

        3)无法缓存多个数据,任务通知是通过更新任务通知值来发送数据的,任务结构体中只有一个任务通知值,只能保存一个数据;

        4)发送受阻不支持,发送方无法进入阻塞状态等待。

1.3、任务通知值的更新方式

        1)不覆盖接受任务的通知值;

        2)覆盖接受任务的通知值;

        3)更新接受任务通知值的一个或多个bit;

        4)增加接受任务的通知值。

类型如下:

        1)计数值(数值累计,类型信号量)

        2)对应位,置一(类似事件标志组)

        3)任意数值(支持覆写或不覆写,类似队列)

以上更新方式,只要合理,灵活的利用任务通知的特点,可以在一些场合中替代队列、信号量、事件标志组。

1.4、任务通知值状态

任务都有一个结构体:任务控制块TCB,存在两个结构体成员变量,如下图1:

图1

注意:uint32_t类型,用来表示通知值;uint8_t类型,用来表示通知状态;
 

1.5、任务通知状态

任务通知状态有3种取值,如下图2:

图2

 名称,任务未等待通知,含义:任务通知默认的初始化状态

 名称,等待通知,含义:接收方已准备好(此时已调用接收任务通知函数),等待发送方给通知

 名称,等待接收,含义:发送方已发送(此时已调用发送任务通知函数),等待接收方接收

1.6、任务通知方式类型

代码实现:

typedef enum
{
    eNoAction = 0,            /* Notify the task without updating its notify value. */
    eSetBits,                 /* Set bits in the task's notification value. */
    eIncrement,               /* Increment the task's notification value. */
    eSetValueWithOverwrite,   /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */
    eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */
} eNotifyAction;

参数含义:

名称,eNoAction ,含义:无操作

名称,eSetBits,含义:更新指定位

名称,eIncrement,含义:通知值+1

名称,eSetValueWithOverwrite,含义:覆写方式更新通知值

名称,eSetValueWithoutOverwrite ,含义:不覆写方式更新通知值

二、任务通知相关API函数

2.1、常用的发送通知API函数

如下图4:

 图4

2.2、带通知值的发送通知函数

代码实现:

BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify,
                               UBaseType_t uxIndexToNotify,
                               uint32_t ulValue,
                               eNotifyAction eAction,
                               uint32_t * pulPreviousNotificationValue ) PRIVILEGED_FUNCTION;

参数含义:

名称,xTaskToNotify,含义:接收任务通知的任务句柄

名称,uxIndexToNotify,含义:任务的指定通知

名称,ulValue,含义:任务通知值

名称,eAction,含义:通知方式(通知值关系方式)

名称,pulPreviousNotificationValue ,含义:用于保存更新前的任务通知值(NULL不保存)

2.3、常用的接收通知API函数

函数名称:ulTaskNotifyTask()

作用:获取任务通知,可以设置在退出此函数时将任务通知值清零或-1;当任务通知用作二值信号量或计数信号量时,使用此函数获取信号量。

函数名称:xTaskNotifyWait()

作用:获取任务通知,比ulTaskNotifyTask更复杂,可获取通知值和清除通知值的指定位。

2.4、ulTaskGenericNotifyTake函数

代码实现:

#define ulTaskNotifyTake( xClearCountOnExit, xTicksToWait ) \
    ulTaskGenericNotifyTake( ( tskDEFAULT_INDEX_TO_NOTIFY ), ( xClearCountOnExit ), ( xTicksToWait ) )

参数含义:

名称,tskDEFAULT_INDEX_TO_NOTIFY ,含义:任务的指定通知

名称,xClearCountOnExit ,含义:指定任务在成功接收通知后,将通知值清零或-1;pdTRUE-->把通知值清零,pdFALSE-->把通知值-1

名称,xTicksToWait ,含义:阻塞等待任务通知值的最大时间

返回值含义:

返回,0,含义:接收失败

返回,非0,含义:接收成功,返回任务通知的通知值

2.5、xTaskGenericNotifyWait函数

代码实现:

#define xTaskNotifyWait( ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ) \
    xTaskGenericNotifyWait( tskDEFAULT_INDEX_TO_NOTIFY, ( ulBitsToClearOnEntry ), ( ulBitsToClearOnExit ), ( pulNotificationValue ), ( xTicksToWait ) )

参数含义:

名称,tskDEFAULT_INDEX_TO_NOTIFY,含义:任务的指定通知

名称,ulBitsToClearOnEntry ,含义:等待清零指定任务通知的比特位

名称,ulBitsToClearOnExit ,含义:成功等待后清零指定的任务通知值比特位

名称,pulNotificationValue ,含义:用来取出通知值(不使用设为NULL)

名称,xTicksToWait ,含义:阻塞等待任务通知值的最大时间

返回值含义:

返回,pdTRUE,含义:等待任务通知成功

返回,pdFALSE,含义:等待任务通知失败

注意:此函数用于获取通知值和清除通知值的指定位值,适用于模拟队列和事件标志组,使用该函数来获取任务。

2.6、最佳使用场合

        1)当任务通知用作信号量时,使用函数获取信号量:ulTaskNotifyTask()

        2)当任务通知用作事件标志组或队列时,使用函数来获取:xTaskNotifyWait()

相关文章:

FreeRTOS任务通知 | FreeRTOS十二

目录 说明: 一、任务通知 1.1、什么是任务通知 1.2、任务通知优势与劣势 1.3、任务通知值的更新方式 1.4、任务通知值状态 1.5、任务通知状态 1.6、任务通知方式类型 二、任务通知相关API函数 2.1、常用的发送通知API函数 2.2、带通知值的发送通知函数 …...

CentOS搭建博客typecho

Ubuntu搭建博客typecho_Dyansts的博客-CSDN博客 见过这样的文章展示页面吗? 详细视频安装教程: 9分钟快速搭建typecho博客,让你不再烦恼_哔哩哔哩_bilibili 现在就把他搭建出来 展示页面:Hello World 其他的插件:…...

湖南中创教育PMP如何实施风险应对,避免产生投诉

一、评估风险 评估风险影响的直接或间接价值 面临的潜在威胁,威胁发生的可能性有多大? 威胁一旦发生,损失是多大? 评估承受风险的能力 采取怎样的措施才能将损失降到最低,甚至为零 二、规划风险 对识别出来的风险进行分组或分类 确定…...

Urho3D子系统

通过使用函数RegisterSubsystem(),任何对象都可以作为子系统注册到上下文中。然后,通过调用GetSubsystem(),同一上下文中的任何其他对象都可以访问它们。每个对象类型只能有一个实例作为子系统存在。 发动机初始化后,以下子系统将…...

无线网络术语总结

学习802.11协议,其中有一些英文缩略词,这里做一下总结与记录。 学习资料:知乎徐方鑫 802.11相关文章 802.11协议精读3:CSMA/CD与CSMA/CA - 知乎 (zhihu.com) 无线网络术语缩写全称中文含义APAccessPoint无线访问节点用于无线网络…...

海卡和海派有什么区别

一、海卡和海派有什么区别 海派和海卡实际上就是快船和慢船的区别。都是头程选用海运的方式,海派是到海港海关清关拆柜后,尾程配送是采用快递配送。而海卡则是到海港海关清关拆柜后,尾程选用货车配送。1、海派比较适用于小件货物 海派是海运抵…...

vue3学习资料整理

一、一个后端程序员为什么要学习前端? 1.网上找到的学习理由 《Java后端的我也要学Node.js 了》 https://blog.csdn.net/yusimiao/article/details/104689007 《nodejs后端开发的优缺点(nodejs的概念与特征详解)》 https://www.1pindao.co…...

Linux基础语法进阶版

Linux基础语法 查看文件内容指令 touch 主要是修改文件时间,多用创建文件 -a #只更改访问时间 -m #只更改修改时间 -c --no-create#不创建任何文件cat 展示小文件内容 -b #对于非空输出行编号 -n #对于所有行输出编号 -E #在每行结束处显示"$" -A #展示所…...

近红外染料标记小分子1628790-37-3,Cyanine5.5 alkyne,花青素CY5.5炔基

试剂基团反应特点:Cyanine5.5 alkyne用于点击化学标记的远红外/近红外染料炔烃。氰基5.5是Cy5.5的类似物,一种流行的荧光团,已广泛用于各种应用,包括完整生物体成像。在温和的铜催化化学条件下,该试剂可与叠氮基共轭&a…...

洛谷——P1004 方格取数

【题目描述】 设有 NN 的方格图 (N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0。如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0…...

Linux删除软链接

不防大家试试 unlink 命令 首先我们先来创建一个文件 #mkdir test_chk #touch test_chk/test.txt #vim test_chk/test.txt (这一步随便在这个test.txt里写点东东即可) 下面我们来创建test_chk目录 的软链接 #ln-s test_chk test_chk_ln 软链接创建好了,我们来…...

【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介绍

用于大型Transformer的8-bit矩阵乘法介绍原文地址:A Gentle Introduction to 8-bit Matrix Multiplication for transformers at scale using transformers, accelerate and bitsandbytes 相关博客 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介…...

设计模式之工厂模式详解和应用

目录1 工厂模式的历史由来2.简单工厂模式2.1 简单工厂模式定义2.2 简单工厂模式案例2.3 简单工厂模式相关源码2.4 简单工厂模式优缺点3 工厂方法模式3.1 工厂方法模式定义3.2 工厂方法模式案例3.3 工厂方法模式源码3.4 工厂方法模式优缺点4 抽象工厂模式4.1 抽象工厂模式定义4.…...

ArcGIS中的附件功能

从ArcGIS10起,空间数据库增加了"附件"的功能,可灵活管理与要素相关的附加信息,可以是图像、PDF、文本文档或任意其他文件类型。例如,如果用某个要素表示建筑物,则可以使用附件来添加多张从不同角度拍摄的建筑物照片。 启动附件功能 要想使用附件功能,要素类必…...

epoll单台设备支持百万并发连接

一些概念: linux下一切接文件,文件描述符fd,文件I/O(包含socket,文本文件等),I/O多路复用,reactor模型,水平触发,边沿触发,多线程模型,阻塞和非阻塞&#xf…...

网络字节序

文章目录网络字节序网络字节序 内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 网络数据流的地址统一按大端处理 发送主机通常将发送缓冲区中的数据按内存地址从低到高的…...

03- SVC 支持向量机做人脸识别 (项目三)

数据集描述: sklearn的lfw_people函数在线下载55个外国人图片文件夹数据集来精确实现人脸识别并提取人脸特征向量数据集地址: sklearn.datasets.fetch_lfw_people — scikit-learn 1.2.1 documentationPCA降维: pca PCA(n_components0.9) 数据拆分: X_train, X_test, y_tra…...

浅谈指向二维数组元素的指针变量

(1)指向数组元素的指针变量 例1.有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值. 编写程序 1 #include <stdio.h>2 int main()3 {4 int a[3][4] { 1,3,5,7,9,11,13,15,17,19,21,23 };5 int *p;6 for (p a[0]; p < a[0] 12; p) …...

左右值引用和移动语义

文章首发公众号&#xff1a;iDoitnow 1. 左右值和左右值引用 什么是左值、右值呢&#xff1f;一种极不严谨的理解为&#xff1a;在赋值的时候&#xff0c;能够被放到等号左边的值为左值&#xff0c;放在右边的值为右值。例如&#xff1a; int sum(int x, int y){return x y;…...

一起学习用Verilog在FPGA上实现CNN----(七)全连接层设计

1 全连接层设计 1.1 Layer 进行线性计算的单元layer&#xff0c;原理图如图所示&#xff1a; 1.2 processingElement Layer中的线性计算单元processingElement&#xff0c;原理图如图所示&#xff1a; processingElement模块展开原理图&#xff0c;如图所示&#xff0c;包含…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...