当前位置: 首页 > 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;包含…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

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

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

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

前端倒计时误差!

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

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...