立志最细,FreeRtos中的任务通知(Task Notification)详解!!!

目录

基本概念

任务通知特性

函数原型

简化版函数

专业版函数


             前言:本篇参考,韦东山开发文档,连接放在最后

基本概念

        在FreeRtos操作系统里面,任务通知(Task Notification)是一种专门用在任务间的任务通信机制,被用在任务间的发送信号或者传输数据,特点是效率高,占用内存和cpu非常少

        虽然在FreeRtos中队列(Queue)信号量(Semaphore)事件组(Event Group)都可以实现任务间的通信(唤醒),但是没有使用任务通知,占用内存小和速度快,队列(Queue)信号量(Semaphore)事件组(Event Group)来通知任务的时候,只是将阻塞列表里面的第一个阻塞的任务唤醒,但是不知道这个任务是哪个任务。

任务通知特性

        使用任务通知效率更高相对于,队列,事件,信号量,更加节省内存,不需要创建结构体,不能发送数据给ISR,数据只能被任务独享,发送数据只能被目标人物访问,无法缓冲数据,任务通知只有一个任务通知值,只能保持一个数据,无法广播发送给多个任务,只能实现发送给一个任务。

        tskTaskControlBlock简称tskTCB,是任务通知控制块(Task Control Block)的结构体,包含任务的各种状态信息,成员属性有 ulNotifiedValue 和 ucNotifyState

typedef struct tskTaskControlBlock
{// configTASK_NOTIFICATION_ARRAY_ENTRIES = 1 volatile uint32_t ulNotifiedValue[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];volatile uint8_t ucNotifyState[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];
} tskTCB;

        ulNotifiedValue 任务通知的数值的取值范围,这个成员属性用来存储任务通知的数据,因为是 uint32_t 类型 取值范围在 0x000000 ~ 0xffffff 之间。

        ucNotifyState这个成员属性类型代表着任务通知的状态,能取值的状态类型有三种,taskNOT_WAITING_NOTIFICATION任务不处于等待通知状态

taskWAITING_NOTIFICATION任务等待通知状态

taskNOTIFICATION_RECEIVED任务接受通知状态,也称为peding状态

        如果任务状态为 taskNOT_WAITING_NOTIFICATION 期间有任务通知,并不会转换状态为taskNOTIFICATION_RECEIVED 保持状态,只有任务状态为taskWAITING_NOTIFICATION,这个时候有任务通知,才会转变任务状态为 taskNOTIFICATION_RECEIVED。

函数原型

        任务通知函数分为,简化版,专业版,后者参数更多实现功能更多,同样的前者,实现的是简化版的功能。

简化版专业版
发出通知

xTaskNotifyGive()

vTaskNotifyGiveFromISR()

xTaskNotify()

xTaskNotifyFromISR()

取出通知ulTaskNotifyTake()xTaskNotifyWait()

简化版函数

        简化版函数在任务中给其他任务发送任务通知时,使用 xTaskNotifyGive() ,在ISR(中断)中使用 vTaskNotifyGiveFromISR() 函数,效果为如下所示。

BaseType_t xTaskNotifyGive(TaskHandle_t xTaskToNotify);
void vTaskNotifyGiveFromISR(TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken);

· 使得通知值加一,也就是 ulNotifiedValue 的数值加1

·使 ucNotifyState 的值改变为 taskNOTIFICATION_RECEIVED 也是 pending状态

       这里需要注意的是,当任务的状态为 taskNOT_WAITING_NOTIFICATION 发送的通知会被记录在通知值当中,但任务自身状态不会改变为,taskNOTIFICATION_RECEIVED 只有当任务调用ulTaskNotifyTake() 或者 xTaskNotifyWait() 函数,这个时候自身状态才会转变为 Peding 状态。

        简化版函数使用 ulTaskNotifyTake() 用来接受任务通知,当调用函数时,作用如下所示。

·使任务状态从taskNOT_WAITING_NOTIFICATION变为 taskWAITING_NOTIFICATION1

·当任务在 taskWAITING_NOTIFICATION 接到通知,可以获取通知值进行处理

uint32_t ulTaskNotifyTake(BaseType_t xClearCountOnExit, TickType_t xTicksToWait);

        参数中,BaseType_t xClearCountOnExit 类型为 BaseType_t 作用为 指示在任务退出等待状态时是否清除通知计数值 

值为 pdTRUE在任务接收到通知并退出等待状态后,清除通知计数(即将通知值重置为0)。

值为 pdFALSE保留通知计数。即使任务接收到通知,计数仍然保持不变。

这里需要注意的是,当设置参数的值为pdTRUE,会将 ulNotifiedValue 的数值清除为 0,如果设置为 pdFALSE,这里是不会改变  ulNotifiedValue 里面的数值的。

        同样的参数里面  xTicksToWait 就是设置等待时间,设置为 0 不等待立刻返回,同样的设置为portMAX_DELAY:一直等待

专业版函数

        xTaskNotify/xTaskNotifyWait 这两个函数相对于简单版来说,提供了更多的参数去选择,下满是函数原型。

BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );
BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify,uint32_t ulValue,eNotifyAction eAction,BaseType_t *pxHigherPriorityTaskWoken );

        这里专业版函数,多出来一个 eAction 参数,参数有着不同的取值,有着不同的效果,表格如下

eAction取值参数效果
eNoAction更新状态为peding,未使用ulValue
eSetBits通知值 = 原来的通知值 | ulValue
eIncrement通知值 = 原来的通知值 + 1
eSetValueWithoutOverwrite不覆盖。
eSetValueWithOverwrite覆盖。

        同样的 xTaskNotifyFromISR 函数和 xTaskNotify 很相似,多出来 pxHigherPriorityTaskWoken这个参数,用来指示ISR是否唤醒了一个优先级更高的任务,如果该任务优先级高于当前正在运行的任务,FreeRtos会在ISR结束的时候进行上下文切换,确保最高优先级的任务能够尽快运行。

BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry,uint32_t ulBitsToClearOnExit,uint32_t *pulNotificationValue,TickType_t xTicksToWait );

        专业版的等待函数,也多了很多的参数,具体参数详解如下所示

ulBitsToClearOnEntry :指定任务在等待状态,需要清除的通知位

ulBitsToClearOnExit:指定任务在等待期间要等待通知的位,当指定位被改变时,才会唤醒

pulNotificationValue:参数用来传入,任务发送的通知值

xTicksToWait:函数最大的等待时间,0不等待,portMAX_DELAY 陷入阻塞一直等待。

                                        欢迎指正,希望对你,有所帮助!!!

FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)_哔哩哔哩_bilibili

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

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

相关文章

linux解决resolv.conf重启之后会自动还原的问题的几种方法

在 Ubuntu 系统中,/etc/resolv.conf 文件的内容在重启后会被自动还原,通常是因为该文件由系统的网络管理服务(如 NetworkManager 或 systemd-resolved)动态生成和管理。要防止其重启后被自动还原,你可以尝试以下几种解…

Leetcode—1115. 交替打印 FooBar【中等】(多线程)

2024每日刷题(180) Leetcode—1115. 交替打印 FooBar C实现代码 class FooBar { private:int n;sem_t fooSem;sem_t barSem;public:FooBar(int n) {this->n n;sem_init(&fooSem, 0, 1);sem_init(&barSem, 0, 0);}~FooBar() {sem_destroy(&…

免杀对抗—内存加载UUID标识IPV4地址MAC地址

前言 试想我们开辟一块内存,然后直接将shellcode写入到对应的内存中并且该内存是可读可写可执行的状态,那么这种方式太容易被AV所查杀,因此当我们如果是利用Windows自身提供的API来将加密或者封装好的shellcode写入到内存执行的话,将会大大增加查杀的难度。 参考文章&#xf…

Linux的pinctrl和gpio子系统

上一章我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式中硬件初始化这一部分和裸机基本没啥区别。Linux 是一个庞大而完善的系统,尤其是驱动框架,像 GPIO …

【HuggingFace 如何上传数据集】快速上传图片、文本等各种格式的数据

【HuggingFace 下载】diffusers 中的特定模型下载,access token 使用方法总结【HuggingFace 下载中断】Git LFS 如何下载指定文件、单个文件夹? 如果只是为了上传备份、或者迁移数据,可以不用 huggingface dataset,而是直接使用 …

k8s权限控制RBAC中的clusterrole serviceaccount rolebinding 有什么作用

在 Kubernetes 的权限控制模型中,RBAC(基于角色的访问控制,Role-Based Access Control)用于管理对集群资源的访问权限。ClusterRole、ServiceAccount 和 RoleBinding 是其中的关键概念。下面是它们的作用: 1. ClusterRole 作用: ClusterRole 定义了一组权限(可以访问或操…

Stm32+Esp8266连接阿里云程序移植教程(MQTT协议)

Stm32Esp8266连接阿里云程序移植教程(MQTT协议) 一、前期准备二、移植过程三、程序的使用3.1 连接上阿里云3.2 传输用户数据到阿里云3.3 解析从阿里云下发给用户的数据3.4 关于调试接口 一、前期准备 自己要的工程文件移植所需的文件(如下图&…

python实现:两个自然数 X,Y 相除,商 3 余 10,被除数、除数、商、余数的和是 163。求被除数、除数分别是多少?

题目&#xff1a; 两个自然数 X&#xff0c;Y 相除&#xff0c;商 3 余 10&#xff0c;被除数、除数、商、余数的和是 163。求被除数、除数分别是多少 答案&#xff1a; y1 while y<163:if (3*y10)y310163:x163-3-10-ybreakyy1 print(f"被除数为&#xff1a;{x}、除…

消息展示区(二)

消息展示区&#xff08;二&#xff09; 前言 在上一集我们初始化了右窗口的消息展示区&#xff0c;对每一条消息我们创建了对象和布局管理器&#xff0c;并且在这个布局管理器中添加了发送者的头像&#xff0c;并分类讨论了左侧消息和右侧消息&#xff0c;那么我们这一集将会…

新手必看!手把手教你打造10W+爆款文章

自定义 GPTs 的引入彻底改变了博主、营销人员和内容创作者在 ChatGPT 高级版本中的写作方式。这些自定义 GPTs 提供个性化的 AI 工具&#xff0c;旨在执行特定任务&#xff0c;使写作过程更顺畅、迅速且高效。从主题头脑风暴到撰写 SEO 友好的内容&#xff0c;自定义 GPTs 满足…

ES6扩展运算符

1.介绍&#xff1a; ... 扩展运算符能将数组转换为逗号分隔的参数序列&#xff1b; 扩展运算符&#xff08;spread&#xff09;也是三个点&#xff08;...&#xff09;。它好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的 参数序列&#xff0c;对数组进…

解决 Jupyter Notebook 环境问题:一步一步指南

Jupyter Notebook 是一个强大的工具&#xff0c;广泛用于数据科学、机器学习和交互式计算。然而&#xff0c;确保它在正确的 Python 环境中运行可能会带来一些挑战。本文将为您提供一个详细的步骤指南&#xff0c;帮助您解决 Jupyter Notebook 环境问题&#xff0c;确保它能够在…

mysql学习教程,从入门到精通,SQL 注入(42)

1、 SQL 注入 SQL 注入是一种严重的安全漏洞&#xff0c;它允许攻击者通过操纵 SQL 查询来访问、修改或删除数据库中的数据。由于 SQL 注入的潜在危害&#xff0c;我不能提供具体的恶意代码示例。然而&#xff0c;我可以向你展示如何防御 SQL 注入&#xff0c;并解释其工作原理…

使用verilog设计实现数字混响效果器及其仿真

以下是一个使用Verilog实现简单数字混响效果器的示例。数字混响效果器通过对输入音频信号进行延迟、衰减和混合等操作来模拟声音在不同空间中的反射效果。 整体架构设计 数字混响效果器主要包括延迟线模块、衰减模块和混音模块。延迟线模块用于存储音频样本并产生延迟效果。衰减…

方波信号发生器(完整SCL源代码)

正弦和余弦信号发生器请参考下面文章链接: 1、博途PLC平台 PLC信号发生器(博途SCL)_博图软件波形发生器怎么用-CSDN博客文章浏览阅读1.1k次。本文介绍了如何使用博途SCL编程实现不同周期和幅值的信号发生器,包括余弦和正弦信号。通过信号发生器,可以用于验证PLC的滤波器效…

Android Framework AMS(06)startActivity分析-3(补充:onPause和onStop相关流程解读)

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读AMS通过startActivity启动Activity的整个流程的补充&#xff0c;更新了startActivity流程分析部分。 一般来说&#xff0c;有Activ…

ZBrush入门使用介绍——17、FiberMesh

大家好&#xff0c;我是阿赵。   继续介绍ZBrush的使用。这次来看看FiberMesh功能。这是一个可以模仿毛发的功能。 一、 使用FiberMesh的预览功能 先准备一个模型&#xff0c;并生成多边形网格 然后按着Ctrl&#xff0c;在模型的表面画一个遮罩。 找到FiberMesh功能&#…

React JSX 使用条件语句渲染UI的两种写法

只针对函数组件 1. 第一种写法&#xff1a; function App({ id }) {return id1? <h1>hello</h1> : <h1>world</h1>; } 或者&#xff1a; function App({ id }) {return (<h1>{id1 && "hello" || id2 && "wo…

JSP 的 response 和 session 内置对象

文章目录 前言一、response 内置对象 1.重定向网页2.处理 HTTP 文件头3.设置输出缓存二、session 内置对象 1.创建及获取客户会话2.会话中移动指定的绑定对象3.销毁 session 内置对象4.会话超时的管理5. session 对象的应用总结 前言 JSP 的 response 和 session 内置对像&…

HCIP——以太网交换安全(四)DHCP Snooping

目录 一、DHCP Snooping的知识点 二、DHCP Snooping实验拓扑 三、总结 一、DHCP Snooping的知识点 1.1、DHCP snooping 概述&#xff1a; ①DHCP Snooping使能DHCP的一种安全特性&#xff0c;用于保证DHCP客户端从合法的DHCP服务端获取IP地址。DHCP服务器记录DHCP客户端IP…