FreeRTOS(任务通知)

资料来源于硬件家园:资料汇总 - 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.mzph.cn/news/36550.shtml

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

相关文章

opencv实战项目 手势识别-实现尺寸缩放效果

手势识别系列文章目录 手势识别是一种人机交互技术,通过识别人的手势动作,从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪(定位手部关键点) 2.opencv实战项目 实现手势跟踪并返回位置信息&…

基于低代码和数字孪生技术的电力运维平台设计

电力能源服务商在为用能企业提供线上服务的时候,不可避免要面对用能企业的各种个性化需求。如果这些需求和想法都要靠平台厂家研发人员来实现,那在周期、成本、效果上都将是无法满足服务运营需要的,这也是目前很多线上能源云平台应用效果不理…

【状态模式】拯救if-else堆出来的屎山代码

前言 我想大家平时都在开发重都遇见过屎山代码,这些屎山代码一般都是由于复杂且庞大的if-else造成的,状态模式,是一种很好的优化屎山代码的设计模式,本文将采用两个业务场景的示例来讲解如何使用状态模式拯救屎山代码。 目录 前…

【Axure高保真原型】通过输入框动态控制环形图

今天和大家分享通过输入框动态控制环形图的原型模板,在输入框里维护项目数据,可以自动生成对应的环形图,鼠标移入对应扇形,可以查看对应数据。使用也非常方便,只需要修改输入框里的数据,或者复制粘贴文本&a…

简单记录牛客top101算法题(初级题C语言实现)BM17 二分查找 BM21 旋转数组的最小数字 BM23 二叉树的前序遍历

1. BM17 二分查找 要求:给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1。 输入&#xff1a…

【云原生】K8S存储卷:PV、PVC详解

目录 一、emptyDir存储卷二、hostPath存储卷三、nfs共享存储卷四、PVC 和 PV4.1 NFS使用PV和PVC4.2创建动态PV 一、emptyDir存储卷 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,ku…

UG NX二次开发(C++)-PK函数创建一条圆弧曲线

文章目录 1、前言2、创建一个项目3、添加头文件4、在do_it中添加创建圆曲线的源代码5、调用dll6、再创建一个长方体验证1、前言 采用PK进行UG NX二次开发,现在看到的文章很多是直接创建实体,然后在UG NX的视图区显示出来,对于创建圆曲线的文章不多,本文讲一下PK函数创建圆…

Git 代码分支规范

目的 俗话说:没有规矩,不成方圆。遵循一个好的规章制度能让你的工作事半功倍。同时也可以展现出你做事的认真的态度以及你的专业性,不会显得杂乱无章,管理困难。Git分支规范也是一样。当遵循了某种约定的Git分支,在代…

若依框架浅浅介绍

由若依官网所给介绍可知 1、文件结构介绍 在ruoyi-admin的pom.xml文件中引入了ruoyi-framework、ruoyi-quartz和ruoyi-generatior模块,在ruoyi-framework的pom.xml文件中引入了ruoyi-system模块。 2、技术栈介绍 前端:Vue、Element UI后端&#xff1a…

第1章:绪论

科学、技术、工程、应用 科学:是什么、为什么技术:怎么做工程:怎样做的多快好省应用:怎么使用 定义 机器学习:利用经验改善系统自身的性能。 研究 智能数据分析(数据分析算法) 典型的机器…

电脑ip地址怎么改 ip地址怎么改到别的城市

一、ip地址怎么改到别的城市 1.ip地址怎么改到别的城市,1、重启WIFI路由设备 一般手机或电脑在家或公司上网时都是接入到路由器的WIFI网络,再由路由器分配上网IP地址,如果要更换上网IP那么重启路由器设备后,路由器会向网络运营商进行宽带的重新拨号,此时手机或电脑设…

【【verilog 典型电路设计之加法器树乘法器】】

verilog 典型电路设计之加法器树乘法器 加法器树乘法器 加法器树乘法器的设计思想是“移位后加”,并且加法运算采用加法器树的形式。乘法运算的过程是,被乘数与乘数的每一位相乘并且乘以相应的权值,最后将所得的结果相加,便得到了…

selenium.webdriver Python爬虫教程

文章目录 selenium安装和使用 selenium安装和使用 pip install selenium 下载对应的浏览器驱动 实例化浏览器 from selenium import webdriverbrowser webdriver.Chrome()元素定位 控制浏览器

HTB-Keeper

HTB-Keeper 信息收集80端口 lnorgaardroot 信息收集 80端口 80主页给了一个跳转的链接 跟随链接后到了一个登陆界面。 尝试搜索默认密码。 通过账号root:password登录。不知道为什么我登陆了两次才成功。 通过搜索在Admin->Users->Select里面发现了用户信息。 lno…

WS2812B————动/静态显示

一,系统架构 二,芯片介绍 1.管脚说明 2.数据传输时间 3.时序波形 4.数据传输方法 5.常用电路连接 三,代码展示及说明 驱动模块 在驱动模块首先选择使用状态机,其中包括,空闲状态,复位清空状态&#xff0c…

怎么把图片表格转换成word表格?几个步骤达成

在处理文档时,图片表格的转换是一个常见的需求。而手动输入表格是非常耗时的,因此,使用文本识别软件来自动转换图片表格可以大大提高工作效率。在本文中,我们将介绍如何使用OCR文字识别技术来将图片表格转换为Word表格。 OCR文字识…

15.3 【Linux】循环执行的例行性工作调度

相对于 at 是仅执行一次的工作,循环执行的例行性工作调度则是由 cron (crond) 这个系统服务来控制的。刚刚谈过 Linux 系统上面原本就有非常多的例行性工作,因此这个系统服务是默认启动的。另外, 由于使用者自己也可以…

栈和队列--受限制的线性表

目录 和队列的定义和特点 1.1栈的定义和特点、 1.2队列的定义和特点 1.3栈和队列的应用 2.栈的表示和操作的实现 2.1栈的类型定义 2.2顺序栈的表示和实现 2.2.1初始化 2.2.2入栈 2.2.3出栈 2.2.4取栈顶元素 2.3链栈的表示和实现 2.2.1初始化 2.2.2入栈 2.2.3出栈…

Java-运算符和控制语句(下)(基于c语言的补充)

输出到控制台 System.out.println(msg); // 输出一个字符串, 带换行 System.out.print(msg); // 输出一个字符串, 不带换行 System.out.printf(format, msg); // 格式化输出 从键盘输入 使用 Scanner 读取字符串/整数/浮点数 首先需要导入util包 自动导入util包 这里把回车看…

如何选择最佳的文件传输协议?(FTP、TFTP、Raysync)

在数字化时代,通过互联网传输文件是一项常见的任务。因此,选择适合您企业需求的文件传输协议非常重要。 文件传输协议是发送方和接收方之间的一套规则和信息。它的作用就像网络两端都能理解的一种语言,使得数据可以正确输出并带有正确的文件…