FreeRTOS(任务通知)

news2024/11/27 2:15:27

资料来源于硬件家园:资料汇总 - FreeRTOS实时操作系统课程(多任务管理)

目录

一、任务通知的概念

1、概念

2、发送通知给任务的方式

3、任务通知使用限制

二、任务通知的运行机制

三、任务通知的API函数

1、任务通知的数据结构

2、常用的API函数

3、函数xTaskNotifyGive()

4、函数ulTaskNotifyTake()

5、函数xTaskNotify()

6、函数ulTaskNotifyWait()

7、使用说明

四、任务通知代替二值信号量

五、任务通知代替计数信号量

六、任务通知代替队列

七、任务通知代替事件组


一、任务通知的概念

1、概念

FreeRTOS 从 V8.2.0 版本开始提供任务通知功能,每个任务都有一个 32位的通知值,在多数情况下,任务通可以替代二值信号量、计数信号量、事件组,也可以替代长度为1的队列(可以保存一个 32位整数或指针值)。

相对于以前使用 FreeRTOS 内核通信的资源时必须创建队列、二进制信号量、计数信号量或事件组的情况,使用任务通知显然更灵活。按照 FreeRTOS 官方的说法,使用任务通知比通过信号量等ICP通信方式解除阻塞的任务速度快45%,并且更加省RAM内存空间,任务通知的使用无须创建队列。要想使用任务通知,必须将FreeRTOSConfig.h中的宏定义configUSE_TASK_NOTIFICATIONS设置为1。其实 FreeRTOS 默认是为1的,所以任务通知是默认可用的。

2、发送通知给任务的方式

> 发送通知给任务,如果有通知未读,则不覆盖通知值。

> 发送通知给任务,直接覆盖通知值。

>发送通知给任务, 设置通知值的一个或者多个位,可以当作事件组来使用。

> 发送通知给任务,递增通知值,可以当作信号量使用。

通过对以上任务通知方式的合理使用,可以在一定场合下替代 FreeRTOS 的信号量、队列、事件组等。

3、任务通知使用限制

当然,凡事都有利弊,消息通知虽然处理更快,RAM 开销更小,但也有以下限制:

>只能有一个任务接收通知消息,因为必须指定接收通知的任务。

>只有等待通知的任务可以被阻塞,发送通知的任务在任何情况下都不会因为发送失败

而进入阻塞态。

二、任务通知的运行机制

任务通知属于任务附带的资源,所以在任务被创建时,任务通知也被初始化,我们知道在使用队列、信号量前,必须先创建队列和信号量,目的是创建队列数据结构,比如使用xQueueCreate() 函数创建队列,用xSemaphoreCreateBinary()函数创建二值信号量等。再来看任务通知,由于任务通知的数据结构包含在任务控制块中,只要任务存在,任务通知数据结构就已经创建完毕,可以直接使用,所以使用时很方便

任务通知可以在任务中向指定任务发送通知,也可以在中断中向指定任务发送通知。FreeRTOS的每个任务都有一个32位的通知值,任务控制块中的成员变量ulNotifiedValue 就是这个通知值。只有在任务中可以等待通知,而不允许在中断中等待通知。如果任务在等待的通知暂时无效,任务会根据用户指定的阻塞超时时间进入阻塞状态,我们可以将等待通知的任务看作消费者;其他任务和中断可以向等待通知的任务发送通知,发送通知的任务和中断服务函数可以看作生产者,当其他任务或者中断向这个任务发送任务通知,且任务获得通知以后,该任务就会从阻塞态中解除,这与 FreeRTOS 中内核的其他通信机制一致。

三、任务通知的API函数

1、任务通知的数据结构

任务通知是任务控制块的资源,属于任务控制块中的成员变量。

ulNotifiedValue: 任务通知值,用于保存一个32位整数或指针值

ucNotifyState:  任务通知状态,用于标识任务的通知状态

2、常用的API函数

① 替代二值信号量与计数信号量

发送任务通知:

xTaskNotifyGive()

vTaskNotifyGiveFromISR()

获取任务通知:

ulTaskNotifyTake()

② 替代长为1的队列与事件组

发送任务通知:

xTaskNotify()

vTaskNotifyFromISR()

获取任务通知:

ulTaskNotifyWait()

3、函数xTaskNotifyGive()

① 函数原型

 功能如下:在任务中向指定任务发送通知,使任务通知值加1,这种方式用于信号量

②形参说明

形参1:任务句柄

形参2: 任务通知值,取0

形参3: 指示任务控制块中的变量 ulNotifiedValue 实现加一操作

形参4:空

③返回值

没有超时机制,永远返回pdPASS

4、函数ulTaskNotifyTake()

① 函数原型

功能如下:在任务中获取通知,与xTaskNotifyGive()配套使用,用于替代二值信号量与计数信号量

②形参说明

形参1:退出时是否清零计数。pdTRUE->清零, pdFALSE -> 减1

形参2: 超时时间,单位为系统节拍

③返回值

返回任务之前的任务通知值

5、函数xTaskNotify()

① 函数原型

功能如下:在任务中向指定任务发送通知,根据eAction的值完成不同操作

②形参说明

形参1:任务句柄

形参2: 任务通知值

形参3: 如下图片

形参4: 空

③返回值

根据上面第 3 个形参的说明,将其设置为 eSetValueWithoutOverwrite,有可能返回pdFALSE,其余所有情况都返回值 pdPASS

6、函数ulTaskNotifyWait()

① 函数原型

功能如下:在任务中获取通知,与xTaskNotify()配套使用,用于替代长度位1的队列与事件组

②形参说明

形参1:进入函数时,清除哪些位  ->  0:无变化    1:清除相应位

形参2:退出函数时,清除哪些位  ->  0:无变化    1:清除相应位

形参3:保存通知值

形参4: 超时时间,单位为系统节拍

③返回值

pdTRUE: 获取任务通知成功

pdFALSE:获取任务通知失败

7、使用说明

四、任务通知代替二值信号量

五、任务通知代替计数信号量

 

 

六、任务通知代替队列

 

 

七、任务通知代替事件组

 

 

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

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

相关文章

Java多线程编程中的线程死锁

Java多线程编程中的线程死锁 ​ 在多线程编程中,线程死锁是一种常见的问题,它发生在两个或多个线程互相等待对方释放资源的情况下,导致程序无法继续执行。本文将介绍线程死锁的概念、产生原因、示例以及如何预防和解决线程死锁问题。 线程死…

LeNet中文翻译

Gradient-Based Learning Applied to Document Recognition 基于梯度的学习应用于文档识别 摘要 使用反向传播算法训练的多层神经网络构成了成功的基于梯度的学习技术的最佳示例。给定适当的网络架构,基于梯度的学习算法可用于合成复杂的决策表面,该决策…

【C语言实战项目】通讯录

一.了解项目功能 在本次实战项目中我们的目标是实现一个通讯录: 该通讯录可以用来存储1000个人的信息 每个人的信息包括:姓名、年龄、性别、住址、电话 通讯录提供功能有: 添加联系人信息删除指定联系人信息查找指定联系人信息修改指定联系人信息显示所有…

miniExcel 生成excel

一、nuget dotnet add package MiniExcel --version 1.31.2 二、新建表及数据 ExampleProducts 三、这里我用了Dapper.Query方法 读取excel public virtual async Task<IActionResult> Anonymous(){try{//using (var connection _dbContext.GetDbConnection())//{//…

请教电路高手帮忙Review一下是否可行?

想要实现STM32 3.3V GPIO 控制5V电源通断&#xff0c;默认状态为&#xff1a;接通。 使用如下电路图有无问题&#xff1f;参数是否需要调整&#xff1f;

机器学习笔记之优化算法(十二)梯度下降法:凸函数VS强凸函数

机器学习笔记之优化算法——梯度下降法&#xff1a;凸函数VS强凸函数 引言凸函数&#xff1a;凸函数的定义与判定条件凸函数的一阶条件凸函数的梯度单调性凸函数的二阶条件 强凸函数强凸函数的定义强凸函数的判定条件强凸函数的一阶条件强凸函数的梯度单调性强突函数的二阶条件…

为博客获取阿里云免费HTTPS证书:简易指南

文章目录 前置条件&#xff1a;步骤1 例如阿里云控制台&#xff0c;选择SSL证书步骤2 申请购买免费证书步骤3 创建证书步骤3.1 证书申请步骤3.2 DNS域名验证 步骤4 等待证书审核成功&#xff0c;下载证书总结 本文分享&#xff0c;如何在阿里云申请免费HTTPS证书 前置条件&…

基于Spring Boot的高校在线考试系统的设计与实现(Java+spring boot+VUE+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的高校在线考试系统的设计与实现&#xff08;Javaspring bootVUEMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java s…

Netty:channel的事件顺序

服务端&#xff1a;正常启动的channel事件顺序 REGISTERED -> BIND -> ACTIVE 客户端&#xff1a;正常启动的channel事件顺序 REGISTERED -> CONNECT -> ACTIVE 服务端&#xff1a;接收到客户端连接&#xff0c;为客户端分配的channel的事件顺序 REGISTERED…

分布式唯一ID实战

目录 一、UUID二、数据库方式1、数据库生成之简单方式2、数据库生成 - 多台机器和设置步长&#xff0c;解决性能问题3、Leaf-segment 方案实现4、双 buffer 优化5、Leaf高可用容灾 三、基于Redis实现分布式ID四、雪花算法 一、UUID UUID的标准形式包含32个16进制数字&#xff…

【北大核心】改进花朵授粉算法的无线传感器网络部署优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Django的简介安装与配置及两大设计模式

一.Djang的介绍 1.Django是什么 Django 是使用 Python 语言开发的一款免费而且开源的 Web 应用框架。 由于 Python 语言的跨平台性&#xff0c;所以 Django 同样支持 Windows、Linux 和 Mac 系统。 在 Python 语言炽手可热的当下&#xff0c;Django 也迅速的崛起&#xff0c;在…

K8S系列一:概念入门

I. K8S概览 1.1 K8S是什么&#xff1f; K8S是Kubernetes的全称&#xff0c;官方称其是&#xff1a; Kubernetes is an open source system for managing containerized applications across multiple hosts. It provides basic mechanisms for deployment, maintenance, and …

Figma中文社区来啦,云端协作设计你准备好了吗?

Figma是改变产品设计协作方式的重要工具,但由于没有中文社区,对国内设计师的约束较大。而拥有全中文UI 界面、功能齐全的即时设计资源广场,恰好弥补了Figma的这一短板,它也将取代Figma成为设计师新宠。 1、UI组件集 Figma中文社区替代即时设计资源广场,拥有海量丰富的UI设计组…

【卷积神经网络】卷积,池化,全连接

随着计算机硬件的升级与性能的提高&#xff0c;运算量已不再是阻碍深度学习发展的难题。卷积神经网络&#xff08;Convolution Neural Network&#xff0c;CNN&#xff09;是深度学习中一项代表性的工作&#xff0c;CNN 是受人脑对图像的理解过程启发而提出的模型&#xff0c;其…

wiley:revision 流程

1 上传修改后的word文件 注意&#xff1a;包括没标注修改位置的word文件和标注了修改位置的word文件 2 上传response回复文件 Your Author Response should include relevant comments that you have copied from the decision letter, along with your comments detailing …

香港大学余涛组推出开源XLANG Agent!支持三种Agent模式

作者 |小戏、ZenMoore 一个新的未来又逐渐开始从理论走向现实走到我们身边了。 语言的意义在于使用&#xff0c;而从 ChatGPT 以来这些大规模语言模型的意义&#xff0c;也必然绝不止于 Chat&#xff0c;在四个月前&#xff0c;我们介绍了清华大学关于工具学习的综述《清华发布…

设计师常用的UI设计软件推荐

如今&#xff0c;随着互联网时代设计岗位的演变&#xff0c;近年来出现了一位新兴而受欢迎的专业UI设计师。对于许多对UI设计感兴趣或刚刚接触UI设计的初学者来说&#xff0c;他们不禁想知道&#xff0c;成为一名优秀的UI设计师需要掌握哪些UI软件&#xff1f;今天&#xff0c;…

基于深度信念神经网络+长短期神经网络的降雨量预测,基于dbn-lstm的降雨量预测,dbn原理,lstm原理

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) LSTM原理 DBN-LSTM的降雨量预测 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,通过dbn进行无监督学习提取特征,然后长短期神经…

巨人互动|Facebook企业户哪些是常见的Facebook广告规避系统的原因?

在使用Facebook广告投放时&#xff0c;广告主需要注意广告规避系统&#xff0c;因为这可能会影响他们的广告效果和投放计划。下面&#xff0c;我们将探讨一些常见的Facebook广告规避系统原因&#xff0c;以及如何应对这些问题。 1、过度使用文字 Facebook广告规定&#xff0c…