UCOSIII事件标志组详解

UCOSIII中的事件标志组是一种用于任务同步和事件管理的机制,它允许任务和中断服务例程(ISR)发布事件标志,并允许任务等待这些事件标志的发生。以下是对UCOSIII事件标志组的详细介绍:

1. 定义与创建

  • 定义:在UCOSIII中,事件标志组是OS_FLAG_GRP类型的内核对象,用于管理一串事件标志位。
  • 创建:在使用事件标志组之前,需要调用OSFlagCreate()函数来创建一个事件标志组。这个函数需要指定事件标志组的名称、初始值以及一个用于保存错误码的参数。
void  OSFlagCreate (OS_FLAG_GRP  *p_grp,CPU_CHAR     *p_name,OS_FLAGS      flags,OS_ERR       *p_err)

p_grp:事件标志组对象

p_name:事件标志组的名字

flags:事件标志组里所有标志位的初值,默认写0

p_err:返回错误码,没有错误的就返回OS_ERR_NONE

2. 同步机制

事件标志组与任务之间有两种同步机制:

  • “或”同步:当等待多个事件时,只要任何一个事件发生,任务就会被同步。
  • “与”同步:当所有的事件都发生时,任务才会被同步。

3. 等待事件标志组

  • 等待函数OSFlagPend()函数用于等待一个或多个事件标志位的发生。这个函数可以指定要等待的标志位、超时时间以及等待条件等参数。
  • 等待条件:可以通过OS_OPT参数指定等待条件,如等待任意一个标志位、等待所有标志位、非阻塞等待等。
OS_FLAGS  OSFlagPend (OS_FLAG_GRP  *p_grp,OS_FLAGS      flags,OS_TICK       timeout,OS_OPT        opt,CPU_TS       *p_ts,OS_ERR       *p_err)

p_grp:事件标志组对象

flags:要等待哪些标志位;0x01,则等待bit0;0x05,则等待bit0和bit2;0x83,则等待bit0、bit1、bit7。

timeout:超时时间,默认写0,一直等待

opt:默认是以下格式

OS_OPT_PEND_FLAG_SET_ANY + OS_OPT_PEND_FLAG_CONSUME+OS_OPT_PEND_BLOCKING

OS_OPT_PEND_FLAG_CLR_ALL:等待事件标志组所有的位清零;

OS_OPT_PEND_FLAG_CLR_ANY:等待事件标志组中任意一个标志清零;

OS_OPT_PEND_FLAG_SET_ALL:等待事件标志组中所有的位置位;

OS_OPT_PEND_FLAG_SET_ANY:等待事件标志组中任意一个标志置位。

调用上面四个选项的时候还可以搭配下面三个选项:

OS_OPT_PEND_FLAG_CONSUME:用来设置是否继续保留该事件标志的状态;

OS_OPT_PEND_NON_BLOCKING:标志组不满足条件时不挂起任务;

OS_OPT_PEND_BLOCKING:标志组不满足条件时挂起任务。

p_ts: 用于记录等待事件花了多长时间,默认写NULL,不记录。

p_err: 返回错误码,没有错误的就返回OS_ERR_NONE。

4. 发布事件标志

  • 发布函数OSFlagPost()函数用于发布事件标志,可以指定要置位或清零的标志位。
  • 发布者:任务和ISR都可以发布事件标志,但只有任务可以创建事件标志组、删除事件标志组以及取消其他任务对事件标志组的等待。
OS_FLAGS  OSFlagPost (OS_FLAG_GRP  *p_grp,OS_FLAGS      flags,OS_OPT        opt,OS_ERR       *p_err)

p_grp:事件标志组对象

flags: 结合opt参数一起使用。设置/清零哪些标志位,0x01,则对应bit0;0x05,则对应bit0和bit2;0x83,则对应bit0、bit1、bit7。

opt: OS_OPT_POST_FLAG_SET,对应的bit置位   ,OS_OPT_POST_FLAG_CLR,对应的bit清零.

p_err: 返回错误码,没有错误的就返回OS_ERR_NONE。

5.注意事项

  • 在使用事件标志组时,需要确保已经通过OS_CFG_FLAG_EN宏启用了事件标志组功能。
  • 在设计任务同步逻辑时,应仔细考虑选择“或”同步还是“与”同步机制。
  • 在发布事件标志时,应注意避免不必要的重复发布和潜在的竞争条件。
  • 在使用事件标志组进行任务同步时,应确保任务间的依赖关系和同步逻辑清晰明确,以避免死锁或竞态条件等问题。

6. 使用场景

事件标志组常用于需要同步多个任务或等待多个事件发生的场景。例如,在一个嵌入式系统中,可能需要等待多个按键被按下才能执行某个任务,这时就可以使用事件标志组来实现。我们在前后台系统中一般都是自己定义全局变量标志,然后循环判断,浪费CPU资源,不能合理的调度,UCOSIII的事件标志组很好的解决了这个问题

7.代码实现

7.1创建标志组

#define KEYFLAGS_VALUE	0X00						
OS_FLAG_GRP	EventFlags;		//定义一个事件标志组//创建一个事件标志组OSFlagCreate((OS_FLAG_GRP*)&EventFlags,		//指向事件标志组(CPU_CHAR*	  )"Event Flags",	//名字(OS_FLAGS	  )KEYFLAGS_VALUE,	//事件标志组初始值(OS_ERR*  	  )&err);			//错误码

7.2发送标志组

#define KEY0_FLAG		0x01
#define KEY1_FLAG		0x02
flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,(OS_FLAGS	  )KEY0_FLAG,(OS_OPT	  )OS_OPT_POST_FLAG_SET,(OS_ERR*	  )&err);flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,(OS_FLAGS	  )KEY1_FLAG,(OS_OPT	  )OS_OPT_POST_FLAG_SET,(OS_ERR*     )&err);

7.3等待标志组 

	//等待事件标志组OSFlagPend((OS_FLAG_GRP*)&EventFlags,(OS_FLAGS	)KEY0_FLAG+KEY1_FLAG,(OS_TICK     )0,(OS_OPT	    )OS_OPT_PEND_FLAG_SET_ALL+OS_OPT_PEND_FLAG_CONSUME,(CPU_TS*     )0,(OS_ERR*	    )&err);

注意:有的朋友可能对flags和opt这两个参数不太理解,比如在flags等于0x03的时候,相当于使用了标志组的bit0和bit1,但是此时如果opt设置了 OS_OPT_PEND_FLAG_SET_ANY,等待任意一个标志位置位,会不会两个参数存在冲突,就是只等待任意一个标志位,加起来到不了0x03。其实falgs的这个参数只是定义了任务对哪些事件标志位感兴趣,并不是所有置1的标志位相加是0x03才会同步,刚接触这里可能会被例子里面写的赋值KEY0_FLAG+KEY1_FLAG搞蒙掉。

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

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

相关文章

软考:软件设计师 — 13.数据结构

十三. 数据结构 数据结构部分也可参考文章:Java数据结构知识点 — 5种常见数据结构 1. 线性结构 (1)线性表 顺序表 线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素…

并行计算模型

像其他专业行话一样,并行计算也有自己的行话。行话就像个大坑,坑中的人需要在其中浸淫很久,才能逐渐适应其语境,然而很多行话的使用常常是草率与不精确的。有时候把鬼都听不懂的行话理解了,再跟别人说鬼话,…

【MySQL 06】表的约束

文章目录 🌈 一、约束的概念🌈 二、空属性约束⭐ 1. 空值无法参与运算⭐ 2. 设置非空属性 🌈 三、默认值约束⭐ 1. 默认值使用案例⭐ 2. 同时设置 not null 和 default 🌈 四、列描述约束🌈 五、zerofill 补零约束&…

校园外卖平台小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,商家管理,菜品信息管理,菜品分类管理,购买菜品管理,订单信息管理,系统管理 微信端账号功能包括:系统首页&a…

【python报错已解决】`IndexError: list index out of range`

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查索引范围2.2 方法二…

Java - IDEA开发

使用IDEA开发Java程序步骤: 创建工程 Project;创建模块 Module;创建包 Package;创建类;编写代码; 如何查看JDK版本 Package介绍: package是将项目中的各种文件,比如源代码、编译生成的字节码、配置文件、…

哈希表 - 三数之和

15. 三数之和 方法一&#xff1a;排序双指针 /*** param {number[]} nums* return {number[][]}*/ var threeSum function(nums) {const res [], len nums.length;// 将数组排序nums.sort((a, b) > a - b)for (let i 0; i < len; i) {let l i 1, r len - 1, iNum…

宝塔面板实现定时任务删除 logs文件 加条件删除 只删除一个月前的日志

我们在开发中难免用到了日志功能&#xff0c;随着日志越来越多导致占用我们的内存 下面是一个简单的 使用宝塔面板里面的定时任务来实现删除日志案例 第一步 首先我的日志文件目录 都在log文件夹里面&#xff0c; 每个月生成一个日志文件夹 文件夹命名是年月来命名的 第二…

Java面试八股之什么是AMQP协议

什么是AMQP协议 AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;是一个开放标准的应用层协议&#xff0c;旨在为消息中间件提供一种统一的、标准的通信方式。它允许消息在分布式系统中的应用程序之间进行可靠的、异步的传递。AMQ…

【云原生】Pass容器研发基础——汇总篇

云原生基础汇总 系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了云计算学习的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;每个知识点的修正和深入主要参考各平台大佬的文章&#xff0c…

Linux2.6内核进程调度队列详细讲解

上图是 Linux2.6 内核中进程队列的数据结构&#xff0c;之间关系也已经给大家画出来&#xff0c;方便大家理解。 一个 CPU 拥有一个 runqueue。 Linux真正的调度方式是通过runqueue进行调度的&#xff0c;我们知道进程的优先级范围是根据nice值确定的&#xff0c;而nice值的范围…

Raspberry Pi Pico 2 上实现:实时机器学习(ML)音频噪音抑制功能

Arm 公司的首席软件工程师 Sandeep Mistry 为我们展示了一种全新的巧妙方法&#xff1a; 在 Raspberry Pi Pico 2 上如何将音频噪音抑制应用于麦克风输入。 机器学习&#xff08;ML&#xff09;技术彻底改变了许多软件应用程序的开发方式。应用程序开发人员现在可以为所需系统整…

【单片机】51单片机入门教程(二):定时器的模式详解与中断应用实例

文章目录 51单片机定时器教程:模式详解与中断应用实例1. 介绍2. 51单片机定时器/计数器概述3. 定时器控制寄存器与中断入口4. 模式0:13位定时器/计数器5. 模式1:16位定时器/计数器6. 模式2:8位自动重装载定时器/计数器7. 模式3:分割两个独立的8位定时器/计数器8. 总结51单…

可视化基础的设计四大原则

一个好的数据可视化设计可以帮助观众迅速理解数据背后的意义。然而&#xff0c;如何确保我们的可视化设计既美观又简单易懂呢&#xff1f;本文将介绍四大设计原则——亲密原则、对比原则、对齐原则和重复原则。 1、 亲密原则&#xff08;Proximity&#xff09; 定义与应用&am…

JVM运行时数据区之虚拟机栈

【1】概述 Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;&#xff0c;早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈&#xff0c;其内部保存一个个的栈帧&#xff08;Stack Frame&#xff09;&#xff0c;对应着一次次的Java方法调用。 栈是运行…

Leetcode JAVA刷刷站(20)有效的括号

一、题目概述 二、思路方向 在Java中&#xff0c;要判断一个仅包含括号&#xff08;(, ), {, }, [, ]&#xff09;的字符串是否有效&#xff0c;你可以使用栈&#xff08;Stack&#xff09;数据结构来实现。栈是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的…

达梦数据库 逻辑备份还原

达梦的逻辑备份还原 1.背景2.要求3.实验步骤3.1 相关术语3.2 dexp逻辑导出3.2.1 使用dexp工具3.2.2 dexp相关参数含义3.2.3 四种级别导出3.2.3.1 FULL3.2.3.2 OWNER3.2.3.3 SCHEMAS3.2.3.4 TABLES 3.2.4 使用范例3.2.4.1 环境准备3.2.4.2 dexp逻辑导出 3.3 dimp逻辑导入3.3.1 使…

AI大模型赋能游戏:更智能、更个性化的NPC

参考论文&#xff1a;https://arxiv.org/abs/2403.10249 在传统游戏中&#xff0c;NPC&#xff08;非玩家角色&#xff09;的行为往往是预先设定好的&#xff0c;缺乏灵活性和变化性。然而&#xff0c;基于大模型的NPC可以利用其强大的推理和学习能力&#xff0c;实时生成对话…

汇编语言指令 jmp:jmp short、jmp near ptr、jmp far ptr

引言&#xff1a; 在8086CPU中&#xff0c;可以修改IP&#xff08;Instruction Pointer &#xff0c;指令指针寄存器&#xff09;或同时修改CS&#xff08;Code Segment&#xff0c;代码段寄存器&#xff09;和IP的指令称为转移指令&#xff0c;更通俗的说&#xff0c;转移指令…

React H5设置企业级v6版本路由的配置

路由配置是项目开发的必要一环&#xff0c;尤其是目前流行SPA&#xff0c;下面看看如何使用v6版本路由进行合理的H5路由配置 一、基本页面结构&#xff08;目录根据开发要求建&#xff0c;下面仅用于展示配置路由&#xff09; 二、具体文件实现 1. index.tsx import React f…