(九)任务通知

一、概念

(1)FreeRTOS从V8.2.0版本开始提供任务通知
(2)每个任务都有一个32位的通知值
(3)发送任务通知的几种情况
3.1 发送通知给任务,如果有通知未读,不覆盖通知值
3.2 发送通知给任务,直接覆盖通知值
3.3 发送通知给任务,设置通知值的一个或多个位,可以当做事件组来使用
3.4 发送通知给任务,递增通知值,可以当做计数信号量来使用
(4)只能有一个任务接收通知消息
(5)只有等待通知的任务可以被阻塞
(6)无需创建,属于任务控制块中的变量,创建任务时即创建完成
(7)中断/任务均能发送通知
(8)只有任务可以等待通知,而不允许中断中等待通知
(9)相较于传统方式性能快
(10)使用时需要使能configUSE_TASK_NOTIFICATIONS宏定义

二、使用函数

(1)xTaskNotifyGive发送通知,没有通知值(信号量类型)
(2)xTaskNotify发送通知,带通知值
(3)xTaskNotifyAndQuery发送通知,带通知值,并返回原通知值
(4)ulTaskNotifyTake等待通知(信号量类型)
(5)xTaskNotifyWait等待通知
(6)vTaskNotifyGiveFromISR中断版本的xTaskNotifyGive
(7)xTaskNotifyAndQueryFromISR中断版本的xTaskNotifyAndQuery
(8)xTaskNotifyFromISR中断版本的ulTaskNotifyTake
(9)xTaskNotifyStateClear清除所有未读消息

三、代码示例

(1)任务通知代替消息队列

#include "FreeRTOS.h"
#include "task.h"
#include "led.h"
#include "limits.h"static void task1(void* param);
static void task2(void* param);static TaskHandle_t task1Handler;
static TaskHandle_t task2Handler;int main()
{led_init();portENTER_CRITICAL();   //进入临界区BaseType_t xReturn;/******创建任务1*******/xReturn = xTaskCreate(task1,"task1",128,NULL,2,&task1Handler);if(xReturn==pdTRUE){}/******创建任务2*******/xReturn = xTaskCreate(task2,"task2",128,NULL,2,&task2Handler);if(xReturn==pdTRUE){}portEXIT_CRITICAL();    //退出临界区vTaskStartScheduler();  //开启任务调度器while(1){  }
}//发送消息
void task1(void* param)
{BaseType_t xReturn = pdPASS;uint32_t value1 = 1;uint32_t value2 = 2;while(1){xReturn = xTaskNotify(task2Handler,             //向哪个任务发送通知value1,                   //发送的值eSetValueWithOverwrite);  //写入值方式if(xReturn==pdTRUE){vTaskDelay(1000);}xReturn = xTaskNotify(task2Handler,             //向哪个任务发送通知value2,                   //发送的值eSetValueWithOverwrite);  //写入值方式if(xReturn==pdTRUE){vTaskDelay(1000);}}
}//接收消息
void task2(void* param)
{BaseType_t xReturn;uint32_t recv;while(1){xReturn = xTaskNotifyWait(0x0,                  //进入时要清除的位ULONG_MAX,             //退出时要清除的位,清除所有位&recv,                  //接收的值portMAX_DELAY);        //等待超时时间if(recv == 1 && xReturn==pdTRUE){open();}else if(recv == 2 && xReturn==pdTRUE){close();}}
}

(2)任务通知替换二值信号量

#include "FreeRTOS.h"
#include "task.h"
#include "led.h"
#include "limits.h"static void task1(void* param);
static void task2(void* param);static TaskHandle_t task1Handler;
static TaskHandle_t task2Handler;int main()
{led_init();portENTER_CRITICAL();   //进入临界区BaseType_t xReturn;/******创建任务1*******/xReturn = xTaskCreate(task1,"task1",128,NULL,2,&task1Handler);if(xReturn==pdTRUE){}/******创建任务2*******/xReturn = xTaskCreate(task2,"task2",128,NULL,2,&task2Handler);if(xReturn==pdTRUE){}portEXIT_CRITICAL();    //退出临界区vTaskStartScheduler();  //开启任务调度器while(1){  }
}//发送消息
void task1(void* param)
{while(1){xTaskNotifyGive(task2Handler);vTaskDelay(500);}
}//接收消息
void task2(void* param)
{static int ledcnt=0;while(1){ulTaskNotifyTake(pdTRUE,portMAX_DELAY);ledcnt=!ledcnt;if(ledcnt==1){open();}else if(ledcnt==0){close();}}
}

(3)任务通知代替计数信号量

#include "FreeRTOS.h"
#include "task.h"
#include "led.h"
#include "limits.h"static void task1(void* param);
static void task2(void* param);static TaskHandle_t task1Handler;
static TaskHandle_t task2Handler;int main()
{led_init();portENTER_CRITICAL();   //进入临界区BaseType_t xReturn;/******创建任务1*******/xReturn = xTaskCreate(task1,"task1",128,NULL,2,&task1Handler);if(xReturn==pdTRUE){}/******创建任务2*******/xReturn = xTaskCreate(task2,"task2",128,NULL,2,&task2Handler);if(xReturn==pdTRUE){}portEXIT_CRITICAL();    //退出临界区vTaskStartScheduler();  //开启任务调度器while(1){  }
}//发送消息
void task1(void* param)
{while(1){xTaskNotifyGive(task2Handler);vTaskDelay(500);}
}//接收消息
void task2(void* param)
{static int ledcnt=0;uint32_t retu=0;while(1){retu = ulTaskNotifyTake(pdFALSE,0);if(retu==1) ledcnt=!ledcnt;if(ledcnt==1){open();}else if(ledcnt==0){close();}}
}

(4)任务通知替代事件组

#include "FreeRTOS.h"
#include "task.h"
#include "led.h"
#include "limits.h"static void task1(void* param);
static void task2(void* param);static TaskHandle_t task1Handler;
static TaskHandle_t task2Handler;#define EVENT1 (0x01<<1)
#define EVENT2 (0x01<<2)int main()
{led_init();portENTER_CRITICAL();   //进入临界区BaseType_t xReturn;/******创建任务1*******/xReturn = xTaskCreate(task1,"task1",128,NULL,2,&task1Handler);if(xReturn==pdTRUE){}/******创建任务2*******/xReturn = xTaskCreate(task2,"task2",128,NULL,2,&task2Handler);if(xReturn==pdTRUE){}portEXIT_CRITICAL();    //退出临界区vTaskStartScheduler();  //开启任务调度器while(1){  }
}//发送消息
void task1(void* param)
{while(1){xTaskNotify(task2Handler,EVENT1,eSetBits);//设置任务通知对应位vTaskDelay(500);xTaskNotify(task2Handler,EVENT2,eSetBits);//设置任务通知对应位vTaskDelay(1000);}
}//接收消息
void task2(void* param)
{    uint32_t recv;while(1){xTaskNotifyWait(0x0,ULONG_MAX,&recv,portMAX_DELAY);if(recv == EVENT1){//事件或open();}else if(recv == EVENT2){close();}}
}

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

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

相关文章

pytest之统一接口请求封装

pytest之统一接口请求封装 pytest的requests_util.pyrequests_util.py 接口自动化测试框架的封装yaml文件如何实现接口关联封装yaml文件如何实现动态参数的处理yaml文件如何实现文件上传有参数化时候&#xff0c;怎么实现断言yaml的数据量大怎么处理接口自动化框架的扩展&#…

FFmepg--AVFilter过滤器使用以及yuv视频裁剪

文章目录 AVFilter 流程&#xff1a;api核心代码变量yuv视频裁剪 AVFilter 流程&#xff1a; ⾸先使⽤split滤波器将input流分成两路流&#xff08;main和tmp&#xff09;&#xff0c;然后分别对两路流进⾏处理。对于tmp流&#xff0c;先经过crop滤波器进⾏裁剪处理&#xff0c…

Kotlin零基础入门到进阶实战

教程介绍 Kotlin现在是Google官方认定Android一级开发语言&#xff0c;与Java100%互通&#xff0c;并具备诸多Java尚不支持的新特性&#xff0c;每个Android程序员必备的Kotlin课程&#xff0c;每个Java程序员都需要了解的Kotlin&#xff0c;掌握kotlin可以开发Web前端、Web后…

轻量C++IDE CodeLite的配置和使用

文章目录 下载和安装新建项目测试项目编译的配置单独项目的配置全局项目的配置开启c++11配置第三方库代码补全codelite配置文件路径解决程序中文乱码的问题中文语言支持本人用过的C++环境:Code::Block、Visual Studio、C-Free、Dev-C、QT-Creater、Geany、现在的CodeLite,Cod…

C语言:二叉树基础

一、树 1.1 树的概念 1.树是有n个节点组成的具有层次关系的集合&#xff0c;是一种非线性的结构。 2.树的第一个节点称为根&#xff0c;根没有前驱节点。 3.除了根节点&#xff0c;其余每个节点都只有一个前驱节点&#xff0c;有0个或多个后继节点。 4.节点的度&#x…

主干网络篇 | YOLOv8更换主干网络之GhostNet

前言:Hello大家好,我是小哥谈。GhostNet是2019年由华为诺亚方舟实验室发布的轻量级网络,速度和MobileNetV3相似,但是识别的准确率比MobileNetV3高,在ImageNet ILSVRC2012分类数据集的达到了75.7%的top-1精度。该论文提除了Ghost模块,通过廉价操作生成更多的特征图。基于一…

是德科技keysight DSOX3024T示波器

181/2461/8938产品概述&#xff1a; DSOX3024T 示波器 要特性与技术指标 使用电容触摸屏进行简洁的触控操作&#xff1a; •提高调试效率 •触控设计可以简化文档记录 •使用起来就像您喜欢的智能手机或平板电脑一样简单 使用 MegaZoom IV 技术揭示偶发异常&#xff1a; •超快…

思通舆情 是一款开源免费的舆情系统 介绍

思通舆情 是一款开源免费的舆情系统。 支持本地化部署&#xff0c;支持在线体验。 支持对海量舆情数据分析和挖掘。 无论你是使用者还是共同完善的开发者&#xff0c;欢迎 pull request 或者 留言对我们提出建议。 您的支持和参与就是我们坚持开源的动力&#xff01;请 sta…

申请双软认证需要哪些材料?软件功能测试报告怎么获取?

“双软认证”是指软件产品评估和软件企业评估&#xff0c;其中需要软件测试报告。 企业申请双软认证除了获得软件企业和软件产品的认证资质&#xff0c;同时也是对企业知识产权的一种保护方式&#xff0c;更可以让企业享受国家提供给软件行业的税收优惠政策。 那么&#xff0c;…

6-191 拓扑排序

一项工程由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其他子任务后才能执行。例如,下图表示了一项工程若干子任务之间的先后关系。 编写函数输出所有子任务的拓扑序列。 函数接口定义: Status Push_SeqStack(SeqStack &s, ElemType x)//入栈,x入到…

AS:32590 美国Valve公司IP地址段,抓CS:GO游戏服务器IP

抓 Valve 公司的IP地址段&#xff0c;主要用途是为了CS:GO网络游戏加速IP地址段&#xff0c;严格意义上来说&#xff0c;不同地区对于CS:GO游戏网络加速&#xff0c;需要对应到对应地区去抓IP地址段。 以CS:GO香港地区为例子&#xff1a;抓出来的IP地址基本都是新加坡、香港两…

框架结构模态分析/动力时程分析Matlab有限元编程 【Matlab源码+PPT讲义】|梁单元|地震时程动画|结果后处理|地震弹性时程分析| 隐式动力学

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

蓝桥杯单片机快速开发笔记——特训4 24C02—E2PROM存储按键触发次数

一、原理分析 HC573/HC138&#xff1a;http://t.csdnimg.cn/W0a0U 数码管&#xff1a;http://t.csdnimg.cn/kfm9Y AT24C02 E2PROM&#xff1a;http://t.csdnimg.cn/DI8XH 独立键盘&#xff1a;http://t.csdnimg.cn/YPInc 二、题目要求 在CT107D单片机综合训练平台上&#xff0…

基于springboot+vue的旅游网站

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

JavaScript 权威指南第七版(GPT 重译)(六)

第十五章&#xff1a;JavaScript 在 Web 浏览器中 JavaScript 语言是在 1994 年创建的&#xff0c;旨在使 Web 浏览器显示的文档具有动态行为。自那时以来&#xff0c;该语言已经发生了显著的演变&#xff0c;与此同时&#xff0c;Web 平台的范围和功能也迅速增长。今天&#…

2024.3.24阶段性测试题解

VJ测试链接考试链接 成绩表如下&#xff0c;信息学是非常检验平时努力的&#xff0c;而且也是一分耕耘一分收获的&#xff0c;总的来说每天订正晚训跟只订正一部分题还是有区别的…希望同学们再接再厉。 A题 简单判断题&#xff0c;单独判断首字母&#xff0c;再判断其余字母…

Java 学习和实践笔记(45):数组的遍历,复制,

数组的两种遍历方式&#xff1a; package innerClass;public class Test01 {public static void main(String[] args) {String[] cities {"北京","上海","广州","深圳",};//遍历方式一&#xff0c;这是一般的方式for (int i0; i<…

AI大模型学习:理论基石、优化之道与应用革新

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

列车票务信息管理系统设计与实现|jsp+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW调试部署环境&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java…

100道面试必会算法-11-LFU缓存

100道面试必会算法-11-LFU缓存 题目描述 最不经常使用&#xff08;LFU&#xff09;缓存算法设计并实现数据结构。 实现 LFUCache 类&#xff1a; LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象int get(int key) - 如果键 key 存在于缓存中&#xff0c;则…