FreeRTOS-任务通知

news2025/1/11 8:37:03

任务通知

使用队列、信号量、事件组等方法时,无法知道发送方身份。使用任务通知时,可以明确指定:通知哪个任务。

优势

效率更高。

        使用任务通知来发送事件、数据给某个任务时,效率更高。比队列、信号量、事件组都有优势。

更节省内存。

        使用其他方法时都要先创建对应的结构体,使用任务通知时无需额外创建结构体。

限制

不能发送数据给ISR

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

数据只能给该任务独享

        使用队列、信号量、事件组时,数据保存在结构体中,其他任务、ISR都可以访问结构体的数据。

        使用任务通知时,数据存放入目标任务中,只有它可以访问这些数据。

        在日常工作中,这个限制影响不大。因为很多场合是从多个数据源把数据发给某个任务,而不是把一个数据源的数据发给多个任务。

无法缓存数据

        使用队列时,假设队列深度为N,则它可以保存N个数据。

        使用任务通知时,任务结构体只有一个任务通知值,只能保存一个数据。

无法广播给多个任务

        使用事件组时,可以同时给多个任务发送事件。

        使用任务通知时,只能发一个任务。

如果发送受阻,发送方无法进入阻塞状态等待

        假设队列已满,使用xQueueSendToBack()给队列发送数据时,任务可以进入阻塞状态等待发送完成。

        使用任务通知时,计数接双方无法接收数据,发送方也无法阻塞等待,只能立即返回错误。

任务状态和通知值

每个人物都有一个结构体:TCB。里面有两个成员:uint8_t ucNotifyState(表示通知状态)、uint32_t ulNotifiedValue(表示通知值)。

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;

ucNotifyState有三种取值:

##define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) /* 默认状态,任务没有在等待通知 */
##define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 )     /* 任务在等待通知 */
##define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 )    /* 任务接收到了通知 */

ulNotifiedValue可以有很多类型:

        计数值、位(类似事件组)、任意数值。

事件通知函数

使用任务通知,可以实现轻量级的队列(长度为1)、邮箱(覆盖的队列)、计数型信号量、二进制信号量、事件组。

简化版,调用简单专业版,参数很多
发出通知

xTaskNotifyGive

xTaskNotifyGiveFromISR

xTaskNotify

xTaskNotifyFromISR

取出通知xTaskNotifyTake

xTaskNotifyWait

xTaskNotifyGive/xTaskNotifyTake

xTaskNotifyGive / xTaskNotifyGiveFromISR都是直接给其他任务发送通知,使得通知值+1,并使得通知状态变为taskNOTIFICATION_RECEIVED,表示有数据了,待处理。

xTaskNotifyTake取出通知值。可以实现轻量级的、高效的二进制信号量、计数型信号量。

        如果通知值为0,则阻塞(可以指定超时时间)。

        如果通知值大于0,任务从阻塞态进入就绪态。

        在该函数返回之前,还可以做一些清理工作:把通知值-1,或清零通知值。

/* xTaskToNotify:任务句柄 */
/* 返回值:只能是pdPASS */
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );

/* 	xTaskToNotify:任务句柄 */
/* 	pxHigherPriorityTaskWoken:
		被通知的任务可能正处于阻塞状态。此函数发出通知后,会把它从阻塞状态切换为就绪态。
		如果被唤醒任务的优先级高于当前任务的优先级,则*pxHigherPriorityTaskWoken为pdTRUE,表示在中断返回前要进行任务切换
 */
void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken );

/* 	xClearCountOnExit:函数返回前是否清零。
		pdTRUE:清零通知值。
		pdFALSE:如果通知值大于0,则通知值减一。
	xTicksToWait:任务进入阻塞态的超时时间,等待通知值大于0。
		0:不等待,立即返回。
		portMAX_DELAY:一直等待,直到通知值大于0。
		其他值:Tick Count。可用pdMS_TO_TICKS()。
	返回值:
		函数返回前清零/减一通知值。
		如果xTicksToWait非0,则返回值有两种情况:
			大于0:在超时前,通知值被增加了
			等于0:一直没有其他任务增加通知值,最后超时返回0
 */
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait);

xTaskNotify/xTaskNotifyWait

xTaskNotify可以使用不同参数实现各类功能,如:

        让接收任务的通知值+1:此时xTaskNotify()等同于xTaskNotifyGive()

        设置接收任务的通知值的某一位、某些位。此时为轻量级、更高效的事件组

        把一个新值写入接收任务的通知值:上一次的通知值被读走后,写入才成功。此时为轻量级、长度为1的队列

        用一个新值覆盖接收任务的通知值:无论上一次的通知值是否被读走,覆盖都成功。此时为轻量级邮箱,类似xQueueOverwrite()函数

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

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

相关文章

2024年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题卷④

2024年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题卷④ 2024年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题卷④A模块基础设施设置/安全加固(本模块200分)A-1任务一 登录安全加固&#xf…

父类的@Autowired字段被继承后能否被注入

可以 示例 父类:Animal.class public class Animal {Autowiredprivate PrometheusAlertService prometheusAlertService;public void eat(){System.out.println("eat food");}} 子类:Dog.class Service public class Dog extends Animal …

园区无线覆盖方案(智慧园区综合解决方案)

​ 李经理正苦恼头疼的工业园区数字化改造项目。近年企业快速增长,园区内Argent工业设备激增,IT部门应接不暇。为确保生产系统稳定运行,IT管理团队经过反复摸索,决定进行全面的数字化升级。然而改造之艰巨远超想象——混杂的接入环境、复杂的专线部署、长达数月的建设周期,种种…

接口获取数据控制台打印有值但是展开又没有了

谷歌浏览器只会展现响应式数据最后的结果,证明原来接口是有值的,后面对这个数据进行操作后,最终没有值了。所以对数据进行操作时最好对数据进行一次深拷贝 JSON.parse(JSON.stringify(data))

.NET Core6.0 MVC+layui+SqlSugar 简单增删改查

HTML部分: {ViewData["Title"] "用户列表"; } <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>用户列表</title><meta name"renderer" content"webkit"><meta …

uniapp微信小程序解决绘制polygon结束时的问题

目录 一、前言 二、实现思路 三、结束标绘具体代码 1、在地图展示工具栏处判断工具按钮是否展示v-if"item.isshow" 2、data声明的工具按钮中新增结束标绘按钮 3、在按钮的点击事件中新增结束标绘的判断 4、判断绘制的线段个数是否大于等于三条&#xff0c;当满…

文件夹备份如何执行更好?三种常见方法

如何有效地进行将公司文件夹备份呢&#xff1f;对于绝大多数上班族而言&#xff0c;电脑已成为工作和生活中不可或缺的工具。在电脑中存储着诸多至关重要的文件和数据&#xff0c;包括公司的机密文件、个人的重要工作文档&#xff0c;甚至可能是珍贵的生活照片和视频等。这些文…

排序算法介绍(二)冒泡排序

0. 简介 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排…

产品经理面试问题(四)

今天和大家免费分享产品经理常见的面试题目&#xff0c;含回答思路分析和回答事例。 【资源下载】 这个模板可以在 Axure高保真原型哦 小程序里免费下载 打开小程序后&#xff0c;在文档模板模块&#xff0c;搜索产品经理面试题目&#xff0c;获取下载地址 更多原型模板、视…

〖大前端 - 基础入门三大核心之JS篇㊸〗- DOM事件对象的方法

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

Python实战之手写一个搜索引擎

文章目录 一、前言二、工作流程三、数据模块四、索引模块五、搜索模块关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职…

淘宝API接口申请指南

一、申请条件数据接口 已注册淘宝账号并完成实名认证&#xff1b;拥有良好的淘宝信用记录&#xff1b;符合淘宝API接口的相关规定。 二、申请流程 登录淘宝账号&#xff0c;进入“卖家中心”页面&#xff1b;点击“我要开店”-“申请应用”&#xff0c;选择“淘宝API”&…

外卖平台推荐算法的优化与实践

目录 引言 一、推荐算法的原理 二、推荐算法的挑战 三、实际案例分析 四、优化推荐算法的策略 五、结论 引言 在当今数字化社会&#xff0c;外卖平台成为了人们生活中不可或缺的一部分。为了提供更加个性化、高效的服务&#xff0c;外卖平台使用推荐算法成为了一项关键技…

分享78个节日PPT,总有一款适合您

分享78个节日PPT&#xff0c;总有一款适合您 78个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1FKJZsOEsWIQHOPxZ3ddcUw?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

高效且实用的表单配置方式:低代码表单上传文件后即刻回显

在现代业务处理流程中&#xff0c;表单上传文件功能的实现已经变得日益重要。而对于用户在上传文件后能够即时看到文件名称的需求&#xff0c;更是对于表单设计的一个基本期望。为了满足这一期望&#xff0c;JVS低代码表单提供了一种高效且实用的配置方式&#xff0c;使得文件名…

光环云与亚马逊云科技成功举办“合作伙伴成长峰会:赋能与共赢”活动

光环云作为由光环新网和西云数据所提供的亚马逊云科技中国区域推广计划的授权增值推广商&#xff0c;致力于帮助中国企业更加方便、高效、安全地享受亚马逊云科技云服务&#xff0c;加速数字化转型。 2023年11月29日&#xff0c;光环云携手亚马逊云科技和商礼科技成功举办“合…

数据库管理-第122期 配置Halo数据库(202301204)

数据库管理-第122期 配置Halo数据库&#xff08;202301204&#xff09; 在120期完成了HaloDB的安装&#xff0c;那么紧接着就需要对数据库进行具体配置。 1 数据库配置 这里首先说一下我这里数据库的给的硬件配置&#xff1a;2个CPU&#xff0c;16GB内存 1 配置数据库访问控…

LabVIEW远程监控

LabVIEW远程监控 远程监控的应用场景 从办公室远程监控工厂车间的测试设备。 在世界另一端的偏远地区监控客户现场的发电设备。 从公司远程监控外场的产品。 技术更新与方法 自2018年以来&#xff0c;NI对基于Web的应用程序支持大幅增长。一些最初的方法&#xff08;如Lab…

用CHAT如何写教研室工作总结?

问CHAT&#xff1a;写一份教研室工作总结 CHAT回复&#xff1a;以下是一个教研室工作总结的大纳&#xff0c;具体内容需要根据你们教研室的实际情况进行填充和修改。 教研室XXXX年度工作总结 1. 引言&#xff1a;简要介绍本年度工作总结的目的和主题。 2. 教育教学工作&…

MDK ARM环境下的伪指令的测试

目录 测试目标&#xff1a; 测试代码&#xff1a; 1. start.s 2. align.s 测试结果&#xff1a; 1 .ldr伪指令的测试结果: 2 .align伪操作测试结果: 结果分析&#xff1a; 测试目标&#xff1a; 熟悉ARM处理器的伪指令&#xff0c;本次实验主要来练习ldr伪指令和align…