µCOS-III从入门到精通 第十三章(事件标志组)

参考教程:【正点原子】手把手教你学UCOS-III实时操作系统_哔哩哔哩_bilibili

一、事件标志组简介

1、概述

(1)事件标志位是一个“位”,用来表示事件是否发生。

(2)事件标志组是一组事件标志位的集合,可以简单的理解事件标志组,是一个整数。

(3)事件标志组的特点:

①每一个位与一个事件相关联,高8位除外,高8位用作存储事件标志组的控制信息。(下图所示的是32 位长度的事件标志组)

②每一位事件的含义,以及高电平和低电平分别代表什么,由用户自己决定。

③任意任务或中断都可以写这些位,但读这些位只能由任务来读。

④可以等待某一位成立,或者等待多位同时成立。

⑤支持读取阻塞。

2、事件标志组相关API函数介绍

(1)事件标志组相关API函数概览:

函数

描述

OSFlagCreate

创建一个事件标志组

OSFlagDel

删除一个事件标志组

OSFlagPend

等待事件标志组中的事件

OSFlagPendAbort

终止挂起等待事件标志组中的事件

OSFlagPendGetFlagRdy

获取任务等待到的事件

OSFlagPost

设置事件标志组中的事件

(2)OSFlagCreate函数:

void  OSFlagCreate
(OS_FLAG_GRP*	p_grp,                   CPU_CHAR*		p_name,                    OS_FLAGS   	    flags,                    OS_ERR*		    p_err
)

形参

描述

p_grp 

指向事件标志组结构体的指针

p_name 

指向作为事件标志组名的 ASCII 字符串的指针

flags 

事件标志组的初始值

p_err 

指向接收错误代码变量的指针

(3)OSFlagPost函数:

OS_FLAGS OSFlagPost   //返回事件标志组更新后的事件标志值
(OS_FLAG_GRP*	p_grp,                      OS_FLAGS     	flags,                      OS_OPT      	opt,                      OS_ERR*		    p_err
)

形参

描述

p_grp 

指向事件标志组结构体的指针

flags 

设置事件指定位清0或置1

opt 

函数操作选项:OS_OPT_POST_FLAG_SET 或 OS_OPT_POST_FLAG_CLR

p_err 

指向接收错误代码变量的指针

(4)OSFlagPend函数:

OS_FLAGS OSFlagPend //返回任务实际等待到的事件标志,如无任何标志准备就绪则为0
(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 

等待的事件标志

timeout 

任务挂起等待事件标志的最大允许时间

opt 

函数操作选项

p_ts 

指向接收等待到事件时的时间戳的变量的指针

p_err 

指向接收错误代码变量的指针

        其中可选的函数操作选项如下所示:

opt

描述

OS_OPT_PEND_FLAG_CLR_ALL

等待“flags”中的所有指定位被清0

OS_OPT_PEND_FLAG_CLR_ANY

等待“flags”中的任意指定位被清0

OS_OPT_PEND_FLAG_SET_ALL

等待“flags”中的所有指定位被置1

OS_OPT_PEND_FLAG_SET_ANY

等待“flags”中的任意指定位被置1

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

OS_OPT_PEND_FLAG_CONSUME

当等待到指定位后,清0对应位

OS_OPT_PEND_BLOCKING

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

OS_OPT_PEND_NON_BLOCKING

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

二、事件标志组实验

1、原理图与实验目标

(1)原理图(按键未画出,接法与任务信号量实验相同):

(2)①设计3个任务——start_task、task1、task2:

[1]start_task:用于创建其它三个任务,并创建事件标志组。

[2]task1:读取按键按下键值,根据不同键值将事件标志组相应事件位置1,模拟事件发生(按下某个按键,对应的标志位置1)。

[3]task2:同时等待事件标志组中的多个事件位,当这些事件位都置1的话就执行相应的处理(串口打印信息),同时清除标志位。

②预期实验现象:

[1]程序下载到板子上后,暂时没有任何现象。

[2]按下相关按键,串口会输出相应的信息。

2、实验步骤

(1)将“任务队列实验”的工程文件夹复制一份,在拷贝版中进行实验。

(2)更改UCOS_experiment.c文件的内容,如下所示。

#include "stm32f10x.h"                  // Device header
#include "os.h"
#include "cpu.h"
#include "Key.h"
#include "Serial.h"
#include <stdio.h>/* START_TASK 任务 配置* 包括: 任务优先级 任务栈大小 任务控制块 任务栈 任务函数*/
#define     START_TASK_PRIO         1
#define     START_TASK_STACK_SIZE  256
CPU_STK     start_task_stack[START_TASK_STACK_SIZE];
OS_TCB      start_task_tcb;
void start_task(void);/* TASK1 任务 配置* 包括: 任务优先级 任务栈大小 任务控制块 任务栈 任务函数*/
#define     TASK1_PRIO              4
#define     TASK1_STACK_SIZE       256
CPU_STK     task1_stack[TASK1_STACK_SIZE];
OS_TCB      task1_tcb;
void task1(void);/* TASK2 任务 配置* 包括: 任务优先级 任务栈大小 任务控制块 任务栈 任务函数*/
#define     TASK2_PRIO              3
#define     TASK2_STACK_SIZE       256
CPU_STK     task2_stack[TASK2_STACK_SIZE];
OS_TCB      task2_tcb;
void task2(void);OS_FLAG_GRP flag;
#define FLAG_BIT0    (1 << 0)    //flag事件标志组bit0位置1时使用
#define FLAG_BIT1    (1 << 1)    //flag事件标志组bit1位置1时使用void UCOS_Test(void)
{OS_ERR err;OSInit(&err);    //初始化μC/OS-III//创建Start TaskOSTaskCreate (&start_task_tcb,"start_task",(OS_TASK_PTR)start_task,NULL,START_TASK_PRIO,start_task_stack,START_TASK_STACK_SIZE / 10,START_TASK_STACK_SIZE,0,0,0,(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),&err);/* 开始任务调度 */OSStart(&err);
}void start_task(void)              
{OS_ERR err;     //接收错误代码使用,对错误代码进行分情况处理可增强程序鲁棒性CPU_Init();     //初始化CPU库CPU_SR_ALLOC();OSFlagCreate (&flag, "flag", 0, &err);  //创建一个事件标志组//滴答定时器重装载值 = 系统主频 / 滴答定时器中断频率(滴答定时器是递减计数)CPU_INT32U cnts = SystemCoreClock / OS_CFG_TICK_RATE_HZ;OS_CPU_SysTickInit(cnts);   //配置Systick中断及优先级CPU_CRITICAL_ENTER();           //进入临界区(关中断)//创建task1OSTaskCreate (&task1_tcb,"task1",(OS_TASK_PTR)task1,0,TASK1_PRIO,task1_stack,TASK1_STACK_SIZE / 10,TASK1_STACK_SIZE,0,0,0,(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),&err);//创建task2OSTaskCreate (&task2_tcb,"task2",(OS_TASK_PTR)task2,0,TASK2_PRIO,task2_stack,TASK2_STACK_SIZE / 10,TASK2_STACK_SIZE,0,0,0,(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),&err);      CPU_CRITICAL_EXIT();            //退出临界区(开中断)OSTaskDel(NULL, &err);   //删除任务自身
}void task1(void)
{OS_ERR err;uint8_t key = 0;while(1){key = Key_GetNum();if(key == 1){Serial_Printf("KEY1按下,bit0置1!!\r\n");OSFlagPost(&flag, FLAG_BIT0, OS_OPT_POST_FLAG_SET, &err);}else if(key == 2){Serial_Printf("KEY2按下,bit1置1!!\r\n");OSFlagPost(&flag, FLAG_BIT1, OS_OPT_POST_FLAG_SET, &err);}OSTimeDly(10,OS_OPT_TIME_DLY,&err);}
}void task2(void)
{OS_ERR err;while(1){OSFlagPend(&flag,                     //事件标志组地址FLAG_BIT0 | FLAG_BIT1,   //等待事件标志组的bit0和bit1位均置10,       OS_OPT_PEND_FLAG_SET_ALL | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_BLOCKING,//等待“flags”中的所有指定位被置1//等待到事件标志位后,清除事件标志组的bit0和bit1位//标志组不满足条件时挂起任务NULL,&err);Serial_Printf("等待到指定事件成立!!!\r\n");}
}

(3)程序完善好后点击“编译”,然后将程序下载到开发板上,打开串口助手分析信息。

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

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

相关文章

LiveGBS流媒体平台GB/T28181常见问题-视频流安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口流地址校验

LiveGBS流媒体平台GB/T28181常见问题频流安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口流地址校验&#xff1f; 1、安全控制1.1、HTTP接口鉴权1.2、流地址鉴权 2、401 Unauthorized2.1、携带token调用接口2.1.1、获取鉴权token2.1.2、调用其它接口2.1.…

短视频下载去水印,用什么工具好?

去除视频和图片水印是许多用户的需求&#xff0c;尤其是在分享或保存内容时。以下是6款超好用的工具&#xff0c;帮助你轻松去除水印&#xff0c;享受纯净的视觉体验&#xff1a; 1. 易下载去水印小程序 特点&#xff1a; 操作简单&#xff0c;支持抖音、快手、小红书、哔哩哔哩…

Java Collection(3)——BinaryTree(二叉树)

前言 1.掌握树的基本概念 2.掌握二叉树概念及特性 3.掌握二叉树的基本操作 后面的优先级队列(大根堆&#xff0c;小根堆)也是基于二叉树实现的&#xff0c;所以理解好二叉树至关重要 1.树形结构 1.1描述 树是一种非线性的数据结构&#xff0c;它是由不为零个有限结点组成一…

[Echarts]图例换行时icon对齐标题

当前效果 目标效果 让图例中的“点”和标题同一行 代码 const data [{value: 100,name: 未标注},{value: 100,name: 已标注},{value: 100,name: 标注中} ];option {tooltip: {backgroundColor: #fff,extraCssText: box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.15);,backgro…

Scala编程_实现Rational的基本操作

在Scala中实现一个简单的有理数&#xff08;Rational&#xff09;类&#xff0c;并对其进行加法、比较等基本操作. 有理数的定义 有理数是可以表示为两个整数的比值的数&#xff0c;通常形式为 n / d&#xff0c;其中 n 是分子&#xff0c;d 是分母。为了确保我们的有理数始终…

责任链模式如何减少模块之间的耦合

责任链模式如何减少模块之间的耦合 在复杂的软件系统中&#xff0c;模块之间的耦合是一个常见的问题。高耦合的代码不仅增加了维护成本&#xff0c;还会导致系统的扩展性和灵活性受限。当我们需要为不同的请求设计灵活的处理逻辑时&#xff0c;传统的硬编码方式会将请求的发送…

【最新】DeepSeek 实用集成工具有那些?

deepseek 系列github仓库地址 【主页】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重点介绍】awesome-deepseek-integration 注意&#xff1a;以下内容来自awesome-deepseek-integration DeepSeek 实用集成&#xff08;awesome-deepseek-integration&#xff09; 将…

如何在Python下实现摄像头|屏幕|AI视觉算法数据的RTMP直播推送

技术背景 在直播应用开发中&#xff0c;RTMP推流是核心功能之一。本文将结合大牛直播SDK的Python接口实现&#xff0c;详细讲解如何在Python环境下进行RTMP推流开发。好多开发者都知道&#xff0c;在发布Python的RTMP推流demo示例之前&#xff0c;我们十年前已经发布了非常稳定…

不用 Tomcat?SpringBoot 项目用啥代替?

在SpringBoot框架中&#xff0c;我们使用最多的是Tomcat&#xff0c;这是SpringBoot默认的容器技术&#xff0c;而且是内嵌式的Tomcat。 同时&#xff0c;SpringBoot也支持Undertow容器&#xff0c;我们可以很方便的用Undertow替换Tomcat&#xff0c;而Undertow的性能和内存使…

LLM训练中常用的Benchmarks

在当今人工智能领域,大语言模型(LLM)凭借其在理解和生成人类自然语言文本方面的卓越表现,成为了备受瞩目的焦点。然而,随着LLM的广泛应用,如何对其性能进行准确、全面的评估成为了一个关键问题。在这样的背景下,大语言模型基准测试应运而生,它是评估LLM不可或缺的重要工…

基于深度学习的医学CT图像肺结节智能检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Selenium | 无法正常打开Google Chrome浏览器 转 Edge Chrome

目录 背景案例 换成 Edge Chrome 驱动下载 配置环境 代码案例 测试结果 背景案例 Python正常&#xff0c;环境正常&#xff0c;驱动正常&#xff0c;但是就是打不开浏览器&#xff0c;就是一直报错&#xff0c;导致很烦躁 换成 Edge Chrome 与 Google Chrome浏览器一样…

【JavaEE】文件操作和IO

【JavaEE】文件操作和IO 一、认识文件1.1 狭义和广义的文件概念1.2 文件路径1.3 文件的分类 二、Java 中操作⽂件2.1 File类2.2 代码演示 三、文件内容的读写 —— 数据流3.1 字节流和字符流字节流字符流 3.2 特别注意 四、实战演示4.1 查找删除文件4.2 普通文件的复制4.3 文件…

【数据挖掘】通过心脏病数据案例熟悉数据挖掘的完整过程

心脏病数据挖掘过程 一、加载数据源 # 如果没有安装数据源所依赖的库&#xff0c;则先安装数据源所在的python库: pip install ucimlrepo # 引入pandas和ucimlrepo import pandas as pd from ucimlrepo import fetch_ucirepo# fetch dataset Heart Disease dataset的Id为45 h…

【Golang】第二弹-----变量、基本数据类型、标识符

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一、变量 1.1基本介绍…

go个人论坛项目

搭建个人论坛 项目地址&#xff1a;MyForum: goginvue搭建论坛 - Gitee.com PS&#xff1a;有些地方没有写好&#xff0c;请选择性查看 初始化项目 创建目录结构 利用ini配置初始化框架 [server] AppMode debug HttpPort :3000 JwtKey "dhjasdkajh321"[databa…

日志系统项目——准备工作了解类的设计模式如单例模式、工厂模式、代理模式

1.六大原则 1.1 单一职责原则 类的职责应该单⼀&#xff0c;⼀个⽅法只做⼀件事。职责划分清晰了&#xff0c;每次改动到最⼩单位的⽅法或 类。 使⽤建议&#xff1a;两个完全不⼀样的功能不应该放⼀个类中&#xff0c;⼀个类中应该是⼀组相关性很⾼的函 数、数据的封装 ⽤例…

股指期货基差怎么计算?公式介绍

先说说啥是基差。简单来说&#xff0c;基差就是股指期货价格和现货指数价格之间的差值。就好比你手里有一张股票指数的“未来提货券”&#xff08;股指期货&#xff09;&#xff0c;但你现在就能买到股票指数&#xff08;现货指数&#xff09;&#xff0c;这两者之间的价格差&a…

Comfyui 与 SDwebui

ComfyUI和SD WebUI是基于Stable Diffusion模型的两种不同用户界面工具&#xff0c;它们在功能、用户体验和适用场景上各有优劣。 1. 功能与灵活性 ComfyUI&#xff1a;ComfyUI以其节点式工作流设计为核心&#xff0c;强调用户自定义和灵活性。用户可以通过连接不同的模块&…

深圳传音控股手机软件开发岗内推

1.负责手机UI、功能开发 2.负责手机具体模块(通信、多媒体、系统、应用)独立开发 3.负责手机软件调试、log分析等 推荐码&#xff1a;EVHPB3 &#xff0c;简历第一时间送到HR面前&#xff5e;