freeRTOS任务通知(1-17)

news2025/1/12 0:49:24

任务通知简介:

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

任务通知的内存消耗比较小

  • 1: 使用队列,信号量,时间标志组都需要另外创建结构体,通过中间结构体进行间接通信。

 

  •  2:使用任务通知时,任务结构体TCB中就包含了内部对象,可以直接接收别人发送过来的通知。

任务通知值的更新方式

  • 1:不覆盖接收任务通知值
  • 2:覆盖接收任务的通知值
  • 3:更新接受任务通知值的一个或多个bit
  • 4:增加接受任务的通知值

注:合理的利用任务通知的特点,可以在一些场合中替代队列,信号量,事件标志组

任务通知的优势和劣势

任务通知的优势:

  • 1:效率更高,使用任务通知向任务发送事件或数据比使用队列事件标志组或信号量快得多。
  • 2:使用内存更小,使用其他方法时都要先创建对应的结构体,使用任务通知时无需额外创建结构体。

任务通知劣势:

  • 1:ISR中没有任务结构体,无法给ISR发送数据,但是ISR可以使用任务通知功能,发数据给任务
  • 2:无法广播给多个任务,任务通知只能是被指定的一个任务接收处理
  • 3:无法缓存多个数据,任务通知是通过更新任务通知值来发送数据的,任务结构体中只有一个任务通知值,只能保持一个数据
  • 4:发送受阻不支持阻塞,发送方无法进入阻塞状态等待

任务通知状态栏:

任务都有一个结构体:任务控制块TCB,它里面有两个结构体成员变量

任务通知值:任务通知值的更新方式有多种类型

  • 1:计数值(数值累加,类似信号量)
  • 2:相应为设置为1(类似事件标志组)
  • 3:任意数值(支持覆写和不覆写,类似队列)------》覆写有没有数值都能将数据写进去,不覆写--------》 有数值就写不进去。

任务的通知状态

 任务通知状态的三种取值:
             #define taskNot_WAITING_NOTIFICATION      ((uint8_t)0)   // 任务未等待通知

             #define taskWAITING_NOTIFICATION          ((uint8_t)1)      // 任务在等待通知

             #define taskNOTIFICATION_RECEIVED         ((uint8_t)2)   // 任务在等待接收

注:

  • 1:任务未等待通知:任务通知默认的初始化状态
  • 2:任务等待通知:接收方已经准备好(调用接收任务通知函数),等待发送方给个通知
  • 3:任务等待接收:发送方已经发送出去(调用了发送任务通知函数),等待接收方接收

 

任务通知API函数

任务通知API函数主要有两类:

  • 1:发送通知
  • 2:接受通知

注:发送通知API函数可以用于任务和中断服务函数中,接收通知API函数只能用在任务中。

发送通知相关API函数

函数描述
xTaskNotify()发送通知,带有通知值
xTaskNotifyAndQuery()发送通知,带有通知值并且保留接收任务的原通知值
xTaskNotifyGive()发送通知,不带通知值
xTaskNotifyFromISR()在中断中发送任务通知
xTaskNotifyAndQueryFromISR()
vTaskNotifyGiveFromISR
BaseType_t xTaskGenericNotify(
      TaskHandle_t   xTaskToNotify    // 接收任务通知的任务句柄
      UBaseType_t    uxIndexToNotify  // 任务的指定通知
      uint32_t       ulValue          // 任务通知值
      eNotifyAction  eAction          // 通知方式
      pulPreviousNotificationValue    // 用于保存更新前任务通知值
                                         NULL表示不保存
)

形参描述
xTaskToNotify   接收任务通知的任务句柄
uxIndexToNotify 任务的指定通知(任务通知相关数组)
ulValue         任务通知值
eAction         通知方式
pulPreviousNotificationValue   用于保存更新前任务通知值, NULL表示不保存

任务通知的几种方式

接收通知相关API函数

函数描述
ulTaskNotifyTask()

获取任务通知,可以设置在推出次函数的时候将任务通知值清零或者减去1

当任务通知用于二值信号量或者计数信号量时,使用此函数获取信号量

xTaskNotifyWait()

获取任务通知,比ulTaskNotifyTak()更复杂,可以获取通知值和清除通知值

指定位

注:

  • 1:当任务通知用作于信号量时,使用函数获取信号量:ulTaskNotifyTake()
  • 2: 当任务通知作用于事件标志组或队列时,使用此函数来获取:xTaskNoyifyWait()
#define ulTaskNotifyTake( xClearCountOnExit , xTicksToWait )

ulTaskGenericNotifyTake( ( tskDEFAULT_INDEX_TO_NOTIFY),
                       ( xClearCountOnExit ),
                       ( xTicksToWait ) )

形参描述
uxIndexToWaitOn任务的指定通知(任务通知相关数组成员)
xClearCountOnExit

指定在成功接收通知后,将通知值清0或则减1

pdTRUE:把通知值清0

pdFALSE:把通知值减1

xTicksToWait阻塞等待任务通知值的最大时间
返回值描述
0接收失败
非0接收成功,返回任务通知的通知值

获取通知值/清除通知值的指定位置

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

返回值 ----------------------》

返回        pdTRUE                    表示任务通知成功

返回        pdFALSE                    表示等待任务通知失败

任务通知实验

1: 任务通知模拟信号量实验

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++设计模式-创建型设计模式

设计模式 设计模式是什么 设计模式是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案;其实就是解决问题的固定套路。但是要慎用设计模式,有一定的工程代码量之后用它比较…

ue引擎游戏开发笔记(29)——实现第三人称角色随手柄力度进行移动

1.需求分析 角色可以随手柄力量大小进行走路和跑步,不动时保持角色停顿。 2.操作实现 1.思路:通过动画蓝图和动画混合实现角色移动和输入的联系。 2.建立动画蓝图和混合空间: 3.在混合空间中对角色移动进行编辑: 4.在蓝图中设定变…

HTML_CSS学习:浮动

一、浮动简介 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>浮动_简介</title><style>div{width: 600px;height: 400px;background-color: #1c80d9;}img{float:…

Java进阶【十三期】:【异常处理】 (抛出捕获异常、自定义异常处理)、处理异常的几种方式 【(File】文件路径操作、File文件处理的综合练习

文章目录 Java进阶【十三期】&#xff1a;异常处理一、异常基本介绍二、编译异常和运行异常三、总结 异常的作用异常的处理方式一、JVM默认的处理方式二、自己处理异常自己 处理的问题 三、总结 Throwable 成员方法抛出异常总结 异常练习自定义异常 FileFile 三个 构造方法File…

【SSM进阶学习系列丨分页篇】PageHelper 分页插件导入集成实践

文章目录 一、说明什么是分页PageHelper介绍 二、导入依赖三、集成Spring框架中四、编写Service五、编写Controller六、编写queryAllByPage页面展示数据 一、说明 什么是分页 ​ 针对分页&#xff0c;使用的是PageHelper分页插件&#xff0c;版本使用的是5.1.8 。 ​ 参考文档…

力扣hot100:543. 二叉树的直径/108. 将有序数组转换为二叉搜索树

一、543. 二叉树的直径 LeetCode&#xff1a;543. 二叉树的直径 二叉树的直径 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。 遇到二叉树的问题很容易去直接用求解的目标去定义递归函数。但是仔细考虑&#xff0c;返回树的直径并不能向上传播。因此我们可以拆…

三维球体空间中光线反射模拟与三维点云提取matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 三维球体空间中光线反射模拟与三维点云提取matlab仿真。设置一个三维的椭球模型&#xff0c;作为墙壁&#xff0c;然后根据光线的反射原理&#xff0c;设计三维空…

Linux内核--设备驱动(四)基础通信接口整理

目录 一、引言 二、I2C ------>2.1、虚拟总线 ------>2.2、I2C适配器序列号指定 ------>2.3、I2C驱动的注册 ------>2.4、I2C设备的创建及注册 ------>2.5、probe 三、I2S 四、DMA ------>4.1、MMU IOMMU 一、引言 本篇文章对于常见通讯接口的内…

华为OD机试 - 小扇和小船的数字游戏 - 二进制(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

题目:方格取数[Easy]

问题描述&#xff1a; 解题思路&#xff1a; 可以使用动态规划&#xff0c;建立dp[i][j][x]&#xff0c;表示&#xff08;1&#xff0c;1&#xff09;到&#xff08;i&#xff0c;j&#xff09;且其积的余数为x的情况下的方案数。时间复杂度为(n^2) * k。 AC代码&#xff1a; …

零基础学习数据库SQL语句之查询表中数据的DQL语句

是用来查询数据库表的记录的语句 在SQL语句中占有90%以上 也是最为复杂的操作 最为繁琐的操作 DQL语句很重要很重要 初始化数据库和表 USE dduo;create table tb_emp(id int unsigned primary key auto_increment comment ID,username varchar(20) not null unique comment…

USB2.0和USB3.0识别方式

一. USB2.0识别方式 USB2.0向下兼容USB1.0和USB1.1&#xff0c;分为低速、全速和高速三种模式。 1. 全速和低速识别 根据规范&#xff0c;全速和低速通过设备端的上拉电阻进行区分。当设备插入HUB或上电时&#xff0c;有上拉电阻的那根数据线就会被拉高&#xff0c;HUB根据D…

StampedLock(戳记锁)源码解读与使用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java源码解读-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 1. 前言 我们在上一篇写ReentrantReadWriteLock读写锁的末尾留了一个小坑&#…

【Anaconda 3 】Jupyter Notebook 的安装配置及使用

Jupyter Notebook 的安装配置及使用 一、引言 Jupyter Notebook 是一种交互式笔记本&#xff0c;它允许用户将代码、注释、方程式、可视化内容等整合到一个文档中&#xff0c;并支持多种编程语言&#xff0c;如 Python、R、Julia 等。它在数据科学、机器学习和教育领域中得到…

ResponseHttp

文章目录 HTTP响应详解使用抓包查看响应报文协议内容 Response对象Response继承体系Response设置响应数据功能介绍Response请求重定向概述实现方式重定向特点 请求重定向和请求转发比较路径问题Response响应字符数据步骤实现 Response响应字节数据步骤实现 HTTP响应详解 使用抓…

Pytorch分布式train——pytorch.distributed.launch V.S. torchrun

1. 较早的pytorch.distributed.launch python -m torch.distributed.launch --nproc_per_node4 --nnodes1 --node_rank0 train.py --args XXX 参数解析&#xff1a; nnodes&#xff1a;节点&#xff08;主机&#xff09;的数量&#xff0c;通常一个节点对应一个主机 node_rank…

K8S哲学 - 资源调度 HPA (horizontal pod autoScaler-sync-period)

kubectl exec&#xff1a; kubectl exec -it pod-name -c container-name -- /bin/sh kubectl run 最小2个node 最大5个

Qt QImageWriter类介绍

1.简介 QImageWriter 用于写入图像文件的类。它提供了将 QImage 对象保存到不同图像格式文件的功能&#xff0c;包括但不限于 PNG、JPEG、BMP 等。QImageWriter 可以将图像写入文件&#xff0c;也可以写入任何 QIODevice&#xff0c;如 QByteArray&#xff0c;这使得它非常灵活…

恶补《操作系统》5_1——王道学习笔记

5设备管理 5.1_1 I-O设备的概念和分类 1、什么是I-O设备 输入/输出&#xff1a;I/O设备就是可以将数据输入到计算机&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件。 2、按使用特性分类 人机交互的外部设备存储设备网络通信设备 3、…

io流,字节流概述

io流概述 io流&#xff1a;输入输出流读写数据的 i 指Input&#xff0c;称为输入流:负责把数据读到内存中去 o指Output&#xff0c;称为输出流:负责写数据出去 io流的分类 按流的方向分为: 输入流和输出流。 按流中数据的最小单位&#xff0c; 分为:字节流&#xff08;适合操作…