(学习日记)2024.04.08:UCOSIII第三十六节:事件

写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。


标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。


点击此处进入学习日记的总目录

2024.04.08:UCOSIII第三十六节:事件

  • 五十、UCOSIII:事件
    • 1、事件的基本概念
    • 2、事件的应用场景
    • 3、事件运作机制
    • 4、事件控制块

五十、UCOSIII:事件

1、事件的基本概念

事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。
与信号量不同的是, 它可以实现一对多,多对多的同步。
即一个任务可以等待多个事件的发生:
可以是任意一个事件发生时唤醒任务进行事件处理; 也可以是几个事件都发生后才唤醒任务进行事件处理。
同样,也可以是多个任务同步多个事件。

每一个事件组只需要很少的RAM空间来保存事件组的状态。
事件组存储在一个OS_FLAGS类型的Flags变量中,该变量在事件结构体中定义。
而变量的宽度由我们自己定义,可以是8位、16位、32位的变量,取决于os_type.h中的OS_FLAGS的位数。
在STM32中,我们一般将其定义为32位的变量, 有32个位用来实现事件标志组。
每一位代表一个事件,任务通过“逻辑与”或“逻辑或”与一个或多个事件建立关联,形成一个事件组。
事件的“逻辑或”也被称作是独立型同步,指的是任务感兴趣的所有事件任一件发生即可被唤醒;
事件“逻辑与”则被称为是关联型同步, 指的是任务感兴趣的若干事件都发生时才被唤醒,并且事件发生的时间可以不同步。

多任务环境下,任务、中断之间往往需要同步操作,一个事件发生会告知等待中的任务,即形成一个任务与任务、 中断与任务间的同步。
事件可以提供一对多、多对多的同步操作。
一对多同步模型:一个任务等待多个事件的触发, 这种情况是比较常见的;
多对多同步模型:多个任务等待多个事件的触发。

任务可以通过设置事件位来实现事件的触发和等待操作。
μC/OS的事件仅用于同步,不提供数据传输功能。

μC/OS提供的事件具有如下特点:

  • 事件只与任务相关联,事件相互独立,一个32位(数据宽度由用户定义)的事件集合用于标识该任务发生的事件类型, 其中每一位表示一种事件类型(0表示该事件类型未发生、1表示该事件类型已经发生),一共32种事件类型。
  • 事件仅用于同步,不提供数据传输功能。
  • 事件无排队性,即多次向任务设置同一事件(如果任务还未来得及读走),等效于只设置一次。
  • 允许多个任务对同一事件进行读写操作。
  • 支持事件等待超时机制。
  • 支持显式清除事件。

在μC/OS的等待事件中,用户可以选择感兴趣的事件,并且选择等待事件的选项。
它有4个属性,分别是逻辑与、逻辑或、等待所有事件清除或者等待任意事件清除。
当任务等待事件同步时,可以通过任务感兴趣的事件位和事件选项来判断当前获取的事件是否满足要求。
如果满足则说明任务等待到对应的事件,系统将唤醒等待的任务; 否则,任务会根据用户指定的阻塞超时时间继续等待下去。

2、事件的应用场景

μC/OS的事件用于事件类型的通讯,无数据传输,也就是说,我们可以用事件来做标志位,判断某些事件是否发生了,然后根据结果做处理。
那为什么不直接用变量做标志呢,岂不是更好更有效率?
非也非也,若是在裸机编程中,用全局变量是最为有效的方法。
但是在操作系统中,使用全局变量就要考虑以下问题了:

  • 如何对全局变量进行保护呢,如何处理多任务同时对它进行访问?
  • 如何让内核对事件进行有效管理呢?使用全局变量的话,就需要在任务中轮询查看事件是否发送,这简直就是在浪费CPU资源啊, 还有等待超时机制,使用全局变量的话需要用户自己去实现。

所以,在操作系统中,还是使用操作系统给我们提供的通信机制就好了,简单方便还实用。

在某些场合,可能需要多个时间发生了才能进行下一步操作,比如一些危险机器的启动,需要检查各项指标,当指标不达标的时候, 无法启动。
但是检查各个指标的时候,不能一下检测完毕。所以需要事件来做统一的等待。
当所有的事件都完成了, 那么机器才允许启动,这只是事件的其中一个应用。

事件可使用于多种场合,它能够在一定程度上替代信号量,用于任务与任务间,中断与任务间的同步。
一个任务或中断服务例程发送一个事件给事件对象, 而后等待的任务被唤醒并对相应的事件进行处理。
但是它与信号量不同的是,事件的发送操作是不可累计的,而信号量的释放动作是可累计的。
事件另外一个特性是, 接收任务可等待多种事件,即多个事件对应一个任务或多个任务。
同时按照任务等待的参数,可选择是“逻辑或”触发还是“逻辑与”触发。
这个特性也是信号量等所不具备的,信号量只能识别单一同步动作,而不能同时等待多个事件的同步。

各个事件可分别发送或一起发送给事件对象,而任务可以等待多个事件,任务仅对感兴趣的事件进行关注。
当有它们感兴趣的事件发生时并且符合感兴趣的条件, 任务将被唤醒并进行后续的处理动作。

3、事件运作机制

等待(接收)事件时,可以根据感兴趣的参事件类型等待事件的单个或者多个事件类型。事件等待成功后, 必须使用OS_OPT_PEND_FLAG_CONSUME选项来清除已接收到的事件类型,否则不会清除已接收到的事件,这样就需要用户显式清除事件位。 用户可以自定义通过传入opt选项来选择读取模式,是等待所有感兴趣的事件还是等待感兴趣的任意一个事件。

设置事件时,对指定事件写入指定的事件类型,设置事件集合的对应事件位为1,可以一次同时写多个事件类型,设置事件成功可能会触发任务调度。

清除事件时,根据入参数事件句柄和待清除的事件类型,对事件对应位进行清零操作。

事件不与任务相关联,事件相互独立,一个32位的变量就是事件的集合,用于标识该任务发生的事件类型, 其中每一位表示一种事件类型(0表示该事件类型未发生、1表示该事件类型已经发生),一共32种事件类型具体见图
在这里插入图片描述
事件唤醒机制,当任务因为等待某个或者多个事件发生而进入阻塞态,当事件发生的时候会被唤醒,其过程具体见图
在这里插入图片描述
任务1对事件3或事件5感兴趣(逻辑或),当发生其中的某一个事件都会被唤醒,并且执行相应操作。
而任务2对事件3与事件5感兴趣(逻辑与), 当且仅当事件3与事件5都发生的时候,任务2才会被唤醒,如果只有一个其中一个事件发生,那么任务还是会继续等待事件发生。
如果在接收事件函数中设置了清除事件位选项OS_OPT_PEND_FLAG_CONSUME,那么当任务唤醒后将把事件3和事件5的事件标志清零,否则事件标志将依然存在。

4、事件控制块

理论上用户可以创建任意个事件(仅限制于处理器的 RAM大小)。
通过设置os_cfg.h中的宏定义 OS_CFG_FLAG_EN为 1即可开启事件功能。
事件是一个内核对象,由数据类型OS_FLAG_GRP定义,该数据类型由 os_flag_grp定义(在os.h文件)。

μC/OS的事件由多个元素组成,在事件被创建时,需要由我们自己定义事件(也可以称之为事件句柄)。
因为它是用于保存事件的一些信息的, 其数据结构OS_FLAG_GRP除了事件必须的一些基本信息外,还有PendList链表与一个32位的事件组变量Flags等,为的是方便系统来管理事件。

示意图具体见图
在这里插入图片描述
数据结构具体如下:

struct  os_flag_grp

{
/* ------------------ GENERIC  MEMBERS ------------------ */
    OS_OBJ_TYPE          Type;                      (1)

    CPU_CHAR            *NamePtr;                   (2)

    OS_PEND_LIST         PendList;                  (3)

#if OS_CFG_DBG_EN > 0u
    OS_FLAG_GRP         *DbgPrevPtr;
    OS_FLAG_GRP         *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif
/* ------------------ SPECIFIC MEMBERS ------------------ */
    OS_FLAGS             Flags;              (4)

    CPU_TS               TS;                 (5)

};
  • (1):事件的类型,用户无需理会,μC/OS用于识别它是一个事件。
  • (2):事件的名字,每个内核对象都会被分配一个名,采用字符串形式记录下来。
  • (3):因为可以有多个任务同时等待系统中的事件, 所以事件中包含了一个用于控制挂起任务列表的结构体,用于记录阻塞在此事件上的任务。
  • (4):事件中包含了很多标志位, Flags这个变量中保存了当前这些标志位的状态。这个变量可以为8位,16位或32位。
  • (5):事件中的变量TS用于保存该事件最后一次被释放的时间戳。当事件被释放时,读取时基计数值并存放到该变量中。

注意:
用户代码不能直接访问这个结构体,必须通过μC/OS提供的API访问。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

本地MinIO存储服务通过Java程序结合cpolar实现远程连接上传文件

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统,它可以100%的运行在标准硬件上,即X86等…

Linux shell编程学习笔记46:awk命令的由来、功能、格式、选项说明、版权、版本

0 前言 在编写Linux Shell脚本的过程中,我们经常要对Linux命令执行的结果进行分析和提取,Linux也在文本分析和提取这方面提供了不少的命令。比如我们之前研究过的cut命令。 Linux shell编程学习笔记43:cut命令https://blog.csdn.net/Purple…

基于R语言的影视评分影响因素实证分析(二)

在某网站抓取了百条数据,试图通过对这些数据的分析,找出电影受欢迎的因素。本案例共获取100条数据。数据详情如下: 1.数据处理及变量描述 首先对数据进行筛选处理,将不需要或者缺失变量进行剔除。 电影类型只保留第一个选项,即《唐人街探案2》的电影类型有喜剧,动作,犯罪…

transformer上手(2) —— 注意力机制

自从 2017 年 Google 发布《Attention is All You Need》之后,各种基于 Transformer 的模型和方法层出不穷。尤其是 2018 年,OpenAI 发布的 GPT 和 Google 发布的 BERT 模型在几乎所有 NLP 任务上都取得了远超先前最强基准的性能,将 Transfor…

苹果手机短信删除了怎么恢复?别急,教你4招恢复技巧

在日常使用中,由于误操作或其他原因,我们可能会不小心删除了重要的短信,这时就需要寻找合适的方法来恢复它们。短信删除了怎么恢复?请接着往下看! 首先,不必过于紧张,因为苹果手机提供了一些功…

二:什么是RocketMQ

RocketMQ是阿里开源的消息中间件产品,纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点,性能强劲(零拷贝技术),支持海量堆积,在阿里内部进行大规模使用,适合在互联网与高并发系统中应用。 官方文档&#xff1a…

深入C语言内存:数据在内存中的存储

一、数据类型 1. unsigned:无符号数类型 当一个数是无符号类型时,那么其最高位的1或0,和其它位一样,用来表示该数的大小。 2.signed:有符号数类型 当一个数是有符号类型时,最高数称为“符号位”。符号位为1…

解决npm install安装node-sass包容易失败的问题

具体问题如下: npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: XXX3.4.0 npm ERR! Found: webpack5.31.2 npm ERR! node_modules/webpack npm ERR! peer webpack”^4.0.0 || ^5.0.0″ from html-…

配置交换机 SSH 管理和端口安全——实验1:配置交换机基本安全和 SSH管理

实验目的 通过本实验可以掌握: 交换机基本安全配置。SSH 的工作原理和 SSH服务端和客户端的配置。 实验拓扑 交换机基本安全和 SSH管理实验拓扑如图所示。 交换机基本安全和 SSH管理实验拓扑 实验步骤 (1)配置交换机S1 Switch>enab…

RTThread studio 驱动开发

rtthread 驱动开发的两种情况 rtthread studio 自动生成 由 RT Thread Studio 自动生成,无需修改任何文件或者简单定义几个宏即可直接使用的驱动,如 GPIO,UART,I2C,SPI,SDIO 和 ETH 等。 使用 RT-Thread S…

快速入门Kotlin④集合

集合概述 继承关系(List、Set和Map均继承了Collection) List List 是一个接口,用于表示列表(List)数据结构。它是一个有序的集合,允许重复元素。 listOf 创建的列表是不可变的,而 mutableListOf 创建的列表是可变的,允许对其进行添加、删除和更新操作。 fun main()…

JAVA面试八股文之Redis相关

Redis相关 Redis6.0为什么要用多线程?在Redis中存一个list集合怎么实现排序?Redis的5大基本类型的底层原理?缓存穿透?缓存击穿?缓存雪崩?redis做为缓存怎么保持和mysql数据进行同步?&#xff08…

老子云、AMRT3D、眸瑞科技

老子云概述 老子云3D可视化快速开发平台,集云压缩、云烘焙、云存储云展示于一体,使3D模型资源自动输出至移动端PC端、Web端,能在多设备、全平台进行展示和交互,是全球领先、自主可控的自动化3D云引擎。 平台架构 平台特性 1、基…

比特币革命:刚刚开始

作者:Marius Farashi Tasooji 编译:秦晋 要充分理解比特币及其含义,首先必须理解什么是价值,什么是货币。以及是什么赋予资产价值? 这个问题看似愚蠢,但实际上非常有趣。我们的生活是由我们消费或出售的物品…

Redis的三种部署方案

文章目录 单机模式主从复制哨兵模式分片集群 在Redis中提供的集群方案总共有三种:单机模式,主从复制集群、哨兵模式,Redis分片集群 单机模式 Redis 只运行在一台服务器上,并且所有的数据都存储在这一台服务器的内存中。 主从复制…

ATF密钥生成和验签

ATF密钥生成和验签 根密钥生成 密钥的生成依赖openssl库,需要提前安装: sudo apt-get install openssl生成.pem格式的RSA4096私钥 openssl genrsa -out pri_key.pem 4096生成对应的DER格式公钥 openssl rsa -in pri_key.pem -pubout -out pub_key.der …

select详细用法

数据库版本:KingbaseES V008R006C008B0014 简介 SELECT语句是用于从一个或多个表中检索数据的操作,它作为数据库DQL语言,可以通过特定条件从表中检索数据。本篇文章以kingbase为例介绍select的详细用法。 文章目录如下 1. 基本语法 2. 条件…

DSP 技术基本概念及典型系统分析

1、 基本概念与典型的DSP系统 通常 DSP(Digital Signal Processing)是指数字信号处理。DSP 芯片是专用的数字信号处理器(Digital Signal Processor),它采用哈佛结数、流水线作业方式的并行处理技术,有专用…

三、SpringBoot3 整合 SpringMVC

本章概要 实现过程web 相关配置静态资源处理自定义拦截器(SpringMVC 配置) 3.1 实现过程 创建程序引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www…

【算法统治世界】动态规划 个人笔记总结

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…