FreeRTOS——任务通知

ops/2024/10/21 5:33:29/

一、任务通知

1.1 任务通知简介

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

(1)使用队列、信号量、事件标志组时都需另外 创建一个结构体 ,通过中间的结构体进行间接通信

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

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

优点:

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

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

缺点:

(1)无法发送数据给中断ISR没有任务结构体,所以无法给ISR发送数据。但是ISR可以使用任务通知的功能,发数据给任务

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

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

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

1.2 任务通知值和通知状态

注:这两个成员变量均为数组

任务通知值:

任务通知状态:

 二、相关API

任务通知API函数主要有两类:①发送通知 ②接收通知

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

(1)发送通知函数

函数

描述

xTaskNotify()

发送通知,带有通知值

xTaskNotifyAndQuery()

发送通知,带有通知值并且保留接收任务的原通知值

xTaskNotifyGive()

发送通知,不带通知值,此函数会将接收任务的通知值加一,常用于信号量

xTaskNotifyFromISR()

在中断中发送任务通知

xTaskNotifyAndQueryFromISR()

vTaskNotifyGiveFromISR()

 注:uxIndexToNotify:任务通知相关数组的成员,实际上就是TCB中任务通知数组的第一个元素(下标为0)

(2)接收通知

函数

描述

ulTaskNotifyTake()

获取任务通知,可以设置在退出此函数的时候将任务通知值清零(模拟二值信号量)或者减一(模拟计数型信号量)

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

xTaskNotifyWait()

获取任务通知,比 ulTaskNotifyTak()更为复杂,可获取通知值和清除通知值的指定位

 总结:

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

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


http://www.ppmy.cn/ops/56240.html

相关文章

Python123:字符串替换、字符串转换成十进制整数(C语言)

文章目录 1、字符串替换2、字符串转换成十进制整数 1、字符串替换 题目: 本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪…

C#控件总结

C#中,控件是用户界面开发的核心部分,它们用于构建和交互应用程序的用户界面。以下是一些常见的控件及其用法总结: 常见控件 Label(标签) 用途:用于显示文本或图像,通常用于显示静态内容。示例代…

电源设计技巧:DDR内存电源

CMOS逻辑系统的功耗主要与时钟频率、系统内各栅极的输入电容以及电源电压有关。器件形体尺寸减小后,电源电压也随之降低,从而在栅极层大大降低功耗。这种低电压器件拥有更低的功耗和更高的运行速度,允许系统时钟频率升高至千兆赫兹级别。在这…

Go bytes包

bytes包 Go 语言中的 bytes 包提供了用于操作字节切片的函数集合。字节切片是 Go 语言中非常常用的数据类型,用于表示二进制数据或 UTF-8 编码的字符串。 bytes 包主要功能 操作和处理字节切片搜索和比较字节切片修改和分割字节切片读取和写入字节切片 使用场景 字…

expdp Ora-00600 expcnt mismatch BUG 修复

环境: 19c 单机 ADG expdp 导出报错 Trace 文件报错 Ora-00600 临时解决办法 1、删除不匹配的对象(对exp基表操作,避免异常建议提前备份) SQL> With b as (select count(*) cnt,objn,snapshot_id from sys.exp_stat$ es group by objn,sn…

【Linux命令基础】vim的简介

文章目录 前言如何在Ubuntu中安装VimVim的作用Vim的优势vim的模式总结前言 在Linux环境中,我们经常需要编辑文本文件,无论是编写代码,还是修改配置文件。而在这些场景中,Vim编辑器无疑是我们的得力助手。Vim是从vi发展出来的一个文本编辑器,代码补全、编译及错误跳转等方…

代码随想录打卡第十八天

代码随想录–二叉树部分 day 17 休息日 day 18 二叉树第五天 文章目录 代码随想录--二叉树部分一、力扣654--最大二叉树二、力扣617--合并二叉树三、力扣700--二乘树中的搜素四、力扣98--验证二叉搜索树 一、力扣654–最大二叉树 代码随想录题目链接:代码随想录 给…

JVM:类的生命周期

文章目录 一、介绍二、加载阶段三、连接阶段四、初始化阶段 一、介绍 类的生命周期描述了一个类加载、连接(验证、准备和解析)、初始化、使用、卸载的整个过程。 加载(Loading)阶段第一步是类加载器根据类的权限定名通过不同的渠…