立志最细,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.rhkb.cn/news/452505.html

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

相关文章

CANoe与C#联合仿真方案

引言 CANoe作为一款强大的网络仿真工具,能够模拟各种通信协议,尤其是在汽车领域的CAN、LIN、Ethernet等协议。而C#作为一种广泛使用的编程语言,能够为CANoe提供灵活的用户界面和逻辑控制。本文将探讨如何将CANoe与C#结合,实现高效的联合仿真方案。 1. 系统架构 联合仿真…

Python学习的自我理解和想法(16)

学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第16天,从今天开始,每天一到两个常用模块,更完恢复到原来的。开学了,时间不多,写…

Bug:通过反射修改@Autowired注入Bean的字段,明确存在,报错 NoSuchFieldException

【BUG】通过Autowired注入了一个Bean SeqNo,测试的时候需要修改其中的字段。通过传统的反射,无论如何都拿不到信息,关键是一方面可以通过IDEA跳转,一方面debug也确实能看到这个字段。但是每次调用set方法报错:NoSuchFi…

Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解

title: Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解 date: 2024/10/19 updated: 2024/10/19 author: cmdragon excerpt: app:templatesGenerated 是 Nuxt.js 的一个生命周期钩子,在模板编译到虚拟文件系统(Virtual File System, VFS)之后被调用。这个钩子允许…

【数据分享】1901-2023年我国省市县三级逐月最低气温(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据(可查看之前的文章获悉详情),该数据来源于国家青藏高原科学数据中心,很多小伙伴拿到数据后反馈栅格数据不太方便使用,问我们能不能把数据处理为更方便使用的Sh…

Android15之解决gdb:Remote register badly formatted问题(二百三十六)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

C++临时变量的常量性

C 临时变量的常量性-CSDN博客 #include <iostream> using namespace std; void print(string& str) {cout << str << endl; }int main() {print("hello world");//print(string("hello world"));return 0; }编译器根据字符串"…

探索 Coconut: Python 的新篇章

文章目录 探索 Coconut: Python 的新篇章背景&#xff1a;为何选择 Coconut&#xff1f;Coconut 是什么&#xff1f;如何安装 Coconut&#xff1f;简单的库函数使用方法1. 惰性列表2. 模式匹配3. 函数组合4. 协程5. 模式匹配数据类型 场景应用1. Web 开发2. 数据处理3. 异步编程…

【C++】类的默认成员函数:深入剖析与应用(下)

&#x1f4af;前言 回顾上篇文章&#x1f449;【C】类的默认成员函数&#xff1a;深入剖析与应用&#xff08;上&#xff09;中对构造函数、拷贝构造函数和析构函数的讨论&#xff0c;强调这些默认成员函数在类的创建、初始化和销毁过程中的重要性。 ✍引出本篇将继续探讨剩余…

【工具变量】A股上市企业大数据应用(2001-2023年)-参考柏淑嫄实践

数据简介&#xff1a;企业数字化转型的浪潮孕育出大数据&#xff0c;大数据技术是在数据处理和应用中释放大数据多元价值的必要手段。大数据作为企业发展的战略资源和生产要素对企业转型发展具有重要意义。对上市企业大数据应用程度进行测算不仅有助于了解大数据相关技术在企业…

Triton Inference Server 架构原理

文章目录 TensorRT-LLM & Triton Server 部署回顾部署梳理Triton 架构 为什么要使用 backend &#xff1f;triton_model_repo 目录结构Ensemble 模式BLS 模式 上篇文章进行了 TensorRT-LLM & Triton Server 部署 &#xff0c;本篇简单讲讲 Triton Inference Server 的架…

ECCV2024 Tracking 汇总

一、OneTrack: Demystifying the Conflict Between Detection and Tracking in End-to-End 3D Trackers paper&#xff1a; https://www.ecva.net/papers/eccv_2024/papers_ECCV/papers/01174.pdf 二、VETRA: A Dataset for Vehicle Tracking in Aerial Imagery paper&#…

基于ECS和NAS搭建个人网盘

前言 在数字化时代&#xff0c;数据已成为我们生活中不可或缺的一部分。个人文件、照片、视频等数据的积累&#xff0c;使得我们需要一个安全、可靠且便捷的存储解决方案。传统的物理存储设备&#xff08;如硬盘、U盘&#xff09;虽然方便&#xff0c;但存在易丢失、损坏和数据…

2013 lost connection to MySQL server during query

1.问题 使用navicat连接doris&#xff0c;会有这个错误。 2.解决 换低版本的navicat比如navicat11。

【LVGL快速入门(二)】LVGL开源框架入门教程之框架使用(UI界面设计)

零.前置篇章 本篇前置文章为【LVGL快速入门(一)】LVGL开源框架入门教程之框架移植 一.UI设计 介绍使用之前&#xff0c;我们要学习一款LVGL官方的UI设计工具SquareLine Studio&#xff0c;使用图形化设计方式设计出我们想要的界面&#xff0c;然后生成对应源文件导入工程使用…

人工智能公司未达到欧盟人工智能法案标准

关注公众号网络研究观获取更多内容。 据路透社获得的数据显示&#xff0c;领先的人工智能&#xff08;AI&#xff09;模型在网络安全弹性和防止歧视性输出等领域未能满足欧洲关键监管标准。 《欧盟人工智能法案》将在未来两年分阶段实施&#xff0c;旨在解决人们对这些技术在…

【计网】从零开始理解TCP协议 --- 拥塞控制机制,延迟应答机制,捎带应答,面向字节流

时间就是性命。 无端的空耗别人的时间&#xff0c; 其实是无异于谋财害命的。 --- 鲁迅 --- 从零开始理解TCP协议 1 拥塞控制2 延迟应答3 捎带应答4 面向字节流5 TCP异常情况TCP小结 1 拥塞控制 尽管TCP拥有滑动窗口这一高效的数据传输机制&#xff0c;能够确保在对方接收…

倍福TwinCAT程序中遇到的bug

文章目录 问题描述&#xff1a;TwinCAT嵌入式控制器CX5140在上电启动后&#xff0c;X001网口接网线通讯灯不亮&#xff0c;软件扫描不到硬件网口 解决方法&#xff1a;硬件断电重启后&#xff0c;X001网口恢复正常 问题描述&#xff1a;TwinCAT软件点击激活配置后&#xff0c;…

RHCE----时间服务器

配置 需要两个服务器&#xff0c;一个服务器&#xff08;服务端IP&#xff1a;192.168.19.130&#xff0c;客户端&#xff1a;192.168.19.131&#xff09; 客户端&#xff08;client131&#xff09; [rootserver1 ~]# vim /etc/chrony.conf 添加阿里云服务器&#xff0c;…

VMware虚拟机软件安装、卸载

VMware是一个软件.这个软件可以刻画出来多个不同配置的计算机硬件(裸机). VMware只能负责产生裸机,要想使用这台机器.需要为其安装操作系统. VMware常见的场景就是用来安装Linux操作系统.... 我们以后要学习大数据hadoop软件,hadoop软件在linux环境下安装.因此我们需要有台装有…