FreeRTOS中任务通知的使用

news2024/12/27 9:39:47

目录

  • 0x01 任务通知介绍
  • 0x02 示例代码

0x01 任务通知介绍

简单举个例子:

例如任务一用于获取数据,任务二用于处理数据。

但这其中存在一个先后关系:必须等到任务一获取完了数据,任务二才能开始工作,你会如何选择何种实现方式呢?

未引入操作系统时,轮询系统会按照代码顺序执行,触发中断时,你可以通过设置一个获取原始数据的函数完成的全局变量作为标志位是否为1来判断是否完成,如果完成则开始执行数据处理任务,否则就等下一轮。
在这里插入图片描述

引入了操作系统后,可以通过二进制信号量的方式进行PV原子操作,这样一来便可以确保 任务一完成后,任务二才能执行

用两份伪代码的方式来描述一下:

任务1-获取数据:
	······
	······
while(数据没获取完)
	获取数据;

V(muttex)//数据获取完了,释放信号量
	······
	······
任务2-处理数据:
	······
	······
while(P(muttex))//获取不到信号量会被阻塞
	静静等待;

处理数据//得到信号量了跳出循环,可以开始工作
	······
	······

很通俗易懂,是一个比较简单的生产消费者模型。

这个和轮询系统的区别就是,引入操作系统可以提高系统的实时性。在轮询系统中,MCU需要不断的去检查标志位的值是否满足条件,这会导致浪费一些资源在这个步骤上。而通过PV操作来获取信号量消耗的资源较少,并且此时任务还是处在被挂起的状态,相比起来是不怎么耗费资源的。相比使用全局变量标志位的方式而言,使用二进制信号量所耗费的资源往往可以接受,并且在获取到信号量的瞬间任务便可以开始工作,而在轮询系统中还需要等到其他代码执行完轮到函数2了,才可以开始执行。

0x02 示例代码

下面使用示例代码说明,使用FreeRTOS的软件定时器来为其发送任务通知,促使LED闪烁。

在收到任务通知时,LED会闪烁一下随后继续等待任务通知马,方可继续闪烁,否则将被阻塞进程。
main.c

#include "tasks.h"  
#include "stdio.h"  

// 等待任务通知的任务
void vHandlerTask( void *pvParameters )
{
	while(1)
	{
		if(ulTaskNotifyTake(pdTRUE, xMaxExpectedBlockTime));//未收到任务通知会被阻塞
			LED_Blink;
	}
}

// 软件定时器回调函数  
void vTimerCallback(TimerHandle_t xTimer) 
{  
    if (xHandlerTaskHandle != NULL) {  
    	// 发送任务通知到vHandlerTask  
        xTaskNotifyGive(xHandlerTaskHandle);  
    }  
}  
  
// 设置并启动软件定时器  
void vStartTimer(void) 
{  
    const TickType_t xTimerPeriod = pdMS_TO_TICKS(1000); // 定时器周期为1000ms(1秒)  
  
    // 创建定时器  
    TimerHandle_t xTimer = xTimerCreate("Timer",  
                                        xTimerPeriod,  
                                        pdTRUE,  
                                        (void *) 0,  
                                        vTimerCallback);  
}  

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

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

相关文章

两个月冲刺软考——概念+求已知内存按字节编址从(A)…到(B)…的存储容量+求采用单/双缓冲区需要花费的时间计算 类型题目讲解

1.四个周期的区别与联系 时钟周期:也称为CPU周期或机器周期,是CPU操作的基本时间单位。 指令周期:是指CPU执行一条指令所需的全部时间。一个指令周期通常由多个时钟周期组成,因为执行一条指令可能需要多个步骤,如取指…

基于 OpenCV 的数字图像处理实验平台设计

基于 OpenCV 的数字图像处理实验平台设计 前言简介正文资源链接(含源码) 前言 哈哈上学那会儿做的一个软件,当时把OpenCV各个基础算法都集成在了一起,还有一定程度的顺序执行部分相关算法的功能,那时候网上相关内容比较…

【开源大模型生态1】逐步成熟

人工智能和大模型的发展,我们之前讨论过,我在人工智能考试笔记中,也有分享。 结合上图,一起再来回顾一下。 机器学习出现之后,大模型逻辑推理为主,聚焦决策、认知能力。 深度学习出现之后,大…

利用注解将数据转为树结构

利用注解生成树结构 ListToTree注解 背景介绍: 通常,我们都有需要将一个列表List,转为树的结构 或许我们或多或少都写过工具类如: 或者: 以上写法,或多或少,都需要我们对集合进行一些处理,写多了自然就变得繁琐,甚至有业务相关的时候,修改会变动麻烦 并且功能比较单一,局限…

IO进程day07(信号灯集、消息队列)

【1】信号灯集 semaphore 1》概念 信号灯(semaphore),也叫信号量,信号灯集是一个信号灯的集合。它是不同进程间或一个给定进程内部不同线程间同步的机制; 而Posix信号灯指的是单个计数信号灯:无名信号灯、有名信号灯。&#xff0…

Spring Security 用户认证和授权管理

文章目录 一、介绍1、简介2、核心概念3、主要功能4、处理流程 二、Spring Security实现权限1、添加依赖2、执行顺序和代码执行流程(1)用户登录(2)访问受保护资源 总结1、用户登录2、访问受保护资源 完整源码 一、介绍 1、简介 S…

SpringBoot+Vue的竞赛报名系统【源码】【最详细运行文档】

SpringBootVue的竞赛报名系统 一、项目简介二、技术选型三、运行步骤1. 后端启动2. 前端启动 四、项目演示登录页管理员登录学生登录源码获取方式 总结 大家好,这里是程序猿代码之路。在现代教育和技术竞赛中,一个高效、稳定的报名系统对于赛事的组织和管…

【Java|Stream流】获取各个数据类型的Stream流

文章目录 1.Stream流介绍2.获取Stream流2.1单列集合2.2双列集合2.3数组2.4零散的数据 3.Stream.of()方法的注意事项 1.Stream流介绍 在 Java 中,Stream 流是一种处理集合数据的高级方式,可以方便地对集合进行各种操作,如过滤、映射、排序、聚…

python:序列1~n的立方之和==序列1~n的和之平方

pip install sympy 或者 Anaconda 3 自带 sympy 点击 【Jupyter Notebook】 这是我最喜欢的代数恒等式之一 from IPython.display import Latex Latex(r"$1^32^33^3\cdotsn^3 (123\cdotsn)^2 $") Latex(r"$\sum_{i1}^n i^3 (\sum_{i1}^n i)^2 $")# 求…

小试牛刀-SOL链创建Token代币

目录 1.编写目的 2.账户结构 3.环境及使用依赖 4.步骤分解 4.1.导入相关依赖 4.2. 初始化变量 4.3. 创建并初始化Mint Account 4.4. 创建并初始化Metadata Account 4.5. 发送创建和初始化mint Account 4.6 铸造代币 5.源码分享 Welcome to Code Blocks blog 本篇文…

视频孪生智慧监所平台,实现监管数据的统一管理和立体直观呈现

针对监所传统方式难以有效管控;监所视频监控相似度极高,难以辨识,工作人员劳动强度大;监所行业涉及的系统众多,缺少统一高效的管理;监所行业对系统应急响应能力、智慧化程度要求高等痛点问题。在智慧监所建…

24数学建模国赛及提供助力(12——存贮论)!!!!

需要资料和助攻的小伙伴们可以文章末尾获取链接!!!! 点击链接加入群聊获取资料以及助攻https://qm.qq.com/q/NGl6WD0Bky

免费作图软件推荐,六款工具助你提升设计效率

在现代设计工作中,合适的作图工具能极大地提高工作效率。对于设计师、学生或是爱好者来说,免费的作图软件无疑是一个经济实惠的选择。本文将为大家介绍 6 款免费且功能强大的作图软件,其中包括国内备受欢迎的免费作图软件以及 5 款优秀的国外…

多态,匿名内部类(lambda表达式),集合

多态(polymorphism) 一个演员扮演多个不同角色。可以减少if语句的使用。 概念 具有接口或者继承关系 A extends B A implement C 类型一致(IEat) 民间说法:父类的引用指向不同的子类对象(不同时刻) 产生不同结果 调用相同方法&#x…

学历不会改变命运但知识一定可以改变命运

一、知识与学历的区别 首先,我们需要区分“知识”与“学历”。学历通常是指一个人通过正规教育体系获得的证书或学位,而知识则是更为宽泛的概念,它包括了一个人通过各种途径获得的信息、技能和理解。学历可能只是知识的一部分,而…

自然语言处理系列五十二》文本分类算法》BERT模型算法原理及文本分类

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列五十二文本分类算法》BERT模型算法原理及文本分…

day7 测试知识积累

1.有一个班级表,里面有学号,姓名,学科,分数。找到语文学科分数最高的前10位的姓名(SQL) select 姓名 from 班级表 where 学科=语文 order by 分数 DESC limit 10; 2.有一张年级表,有班级,年级,学生姓名,找到这10名同学所在的班级(SQL) select class from 年级表 wher…

《python语言程序设计》第8章第12题生物信息:找出基因,生物学家使用字母A C T和G构成字符2串建模一个基因组(上)

草稿一、用单一方法遍历文本 9.1代码 genome_text TTATGTTTTAAGGATGGGGCGTTAGTTdef div_word(word_to_judge):len_num len(word_to_judge)save_word ""if len_num % 3 0:print("This word is valid")if save_word.find("ATG") "ATG&qu…

SpringBoot链路追踪②:如何集成?

首先下载Zipkin的jar包&#xff1a;Central Repository: io/zipkin/zipkin-server (maven.org) 根据自己的项目版本。我的版本分别是&#xff1a; <spring-boot.version>2.7.18</spring-boot.version> <spring-cloud.version>2021.0.8</spring-cloud.ve…

Spring理论知识(Ⅳ)——Spring Instrumentation模块

Spring的组成 Spring由20个核心依赖组成&#xff0c;这20个核心依赖可以分为6个核心模块 Spring Instrumentation模块介绍 总的来说&#xff0c;Spring Instrumentation提供了类植入&#xff08;Instrumentation&#xff09;支持和类加载器的实现&#xff0c;可以在特定…