鸿蒙Hi3861学习八-Huawei LiteOS(事件标记)

news2024/10/6 20:26:45

一、简介

        事件是一种实现任务间通信的机制,可用于实现任务间的同步。但事件通信只能是事件类型的通信,无数据传输。一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。事件集合用32位无符号整型变量来表示,每一位代表一个事件

        多任务环境下,任务之间往往需要同步操作。事件可以提供一对多、多对多的同步操作。一对多同步模型:一个任务等待多个事件的触发;多多对同步模型:多个任务等待多个事件的触发。

        任务可以通过创建事件控制块来实现对事件的触发和等待操作。LiteOS的事件仅用于任务间的同步

        更多事件标记的概念可以参考:FreeRTOS学习七(事件标志组)_portmax_delay_t_guest的博客-CSDN博客

 二、运行机制

        读事件时,可以根据入参事件掩码类型uwEventMask读取事件的单个或者多个事件类型。事件读取成功后,如果设置LOS_WAITMODE_CLR会清除已读取到的事件类型,反之不会清除已读到的事件类型,需手动清除。可以通过参数选择读取模式,读取事件掩码类型中所有事件还是读取事件掩码类型中任意事件。

        写事件时,对指定事件写入指定的事件类型,可以一次同时写多个事件类型。写事件会触发任务调度。

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

三、API介绍

      osEventFlagsNew

        函数功能:

        创建事件标志。不能在中断中调用

        函数原型:

osEventFlagsId_t osEventFlagsNew(const osEventFlagsAttr_t *attr)

        参数:

        attr:属性。自定义内存时才用的到默认设置NULL

        返回值:

        NULL:失败

        其他值:事件标志ID

        实例:

osEventFlagsId_t evt_id; // event flags id
evt_id = osEventFlagsNew(NULL);

      osEventFlagsSet

        函数功能:

        设置事件标志。可以在中断中使用

        函数原型:

uint32_t osEventFlagsSet(osEventFlagsId_t ef_id, uint32_t flags)

        参数:

        ef_id:事件ID。创建事件标志组osEventFlagsNew时获得

        flags:事件值

        返回值:

        如果设置了最高位,则返回设置后的事件标志或错误代码

        实例:

osEventFlagsId_t evt_id; 
uint32_t rst = osEventFlagsSet(evt_id, 0x10001111);

      osEventFlagsWait

        函数功能:

        等待事件发生。可以在中断中调用。

        函数原型:

uint32_t osEventFlagsWait(osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout)

        参数:

        ef_id:事件ID。创建事件标志组osEventFlagsNew时获得

        flags:待触发的事件值。

        options:指定标志选项

osFlagsWaitAny0,等待任何标志(默认),即满足任意标志即可
osFlagsWaitAll1,等待所有标志,即需要满足所有标志。
osFlagsNoClear2,不清除已经指定等待的标志。需要使用 osEventFlagsClear 手动清除标志。

        timeout:超时时间。osWaitForever 死等

        返回值:

        清除前的事件标志或设置最高位时的错误代码

        实例:

osEventFlagsId_t evt_id; 
uint32_t flags;
flags = osEventFlagsWait(evt_id, 0x000000ff, osFlagsWaitAny, osWaitForever);

      osEventFlagsDelete

        函数功能:

        删除事件标志组。不能在中断中调用

        函数原型:

osStatus_t osEventFlagsDelete(osEventFlagsId_t ef_id)

        参数:

        ef_id:事件标志ID。创建事件标志组osEventFlagsNew时获得。

        返回值:

        osOK:成功

        其他值:失败

        实例:

osEventFlagsId_t evt_id;
osEventFlagsDelete(evt_id);

四、实例

        这里创建2个任务,任务1设置事件组,任务2等待事件组。其中,任务1设置完事件组后,立刻移交控制权

#define LOG_I(fmt, args...)   printf("<%8ld> - [TIMER]:"fmt"\r\n",osKernelGetTickCount(),##args);
#define LOG_E(fmt, args...)   printf("<%8ld>-[TIMER_ERR]>>>>>>>>>>>>:"fmt"\r\n",osKernelGetTickCount(), ##args);

osEventFlagsId_t evt_id; // event flags id

/***** 发送事件 *****/
void Thread_EventSender(void *argument)
{
  (void)argument;
  while (1)
  {
    LOG_I("thread1 send event before");
    uint32_t rst = osEventFlagsSet(evt_id, 0x80001111);
    LOG_I("thread1 send event after,rst = 0x%.8x,yield!!",rst);

    //suspend thread
    osThreadYield();

    LOG_I("thread1 send event delay 1S");

    osDelay(100);
  }
}

/***** 接收事件 *****/
void Thread_EventReceiver(void *argument)
{
  (void)argument;
  uint32_t flags;

  while (1)
  {
    flags = osEventFlagsWait(evt_id, 0x000000ff, osFlagsWaitAny, osWaitForever);
    LOG_I("Receive2 Flags is 0x%.8x\n", flags);
  }
}

void Hello_World(void)
{
    LOG_I("Test event");

    evt_id = osEventFlagsNew(NULL);

    if (evt_id == NULL)
    {
        LOG_E("Falied to create EventFlags!");
    }

    osThreadAttr_t attr;

    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024 * 4;
    attr.priority = osPriorityNormal;

    attr.name = "Thread_EventSender";
    if (osThreadNew(Thread_EventSender, NULL, &attr) == NULL)
    {
        LOG_E("Falied to create Thread_EventSender!");
    }

    attr.name = "Thread_EventReceiver";

    if (osThreadNew(Thread_EventReceiver, NULL, &attr) == NULL)
    {
        LOG_E("Falied to create Thread_EventReceiver!");
    }
}

        看结果:

         从结果可以看到,任务2等待0x000000ff事件。而任务1释放的是0x80001111。此时因为设置的等待类型为osFlagsWaitAny,即满足任意条件即触发。所以,直接触发事件,且读出的事件组为0x00000011。

        任务1和任务2优先级相同,但是任务1在设置完事件后,立马释放了控制权。导致任务2可以获取控制权执行代码。

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

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

相关文章

​#立夏# 气温升高,3招提高电路板的散热效率!

电路板是电子设备的核心&#xff0c;上面安装了各种元器件&#xff0c;如电阻、芯片、三极管等。这些元器件在工作时都会产生一定的热量&#xff0c;从而使电路板的温度升高。如果不及时将这些热量散发出去&#xff0c;电路板就会过热&#xff0c;影响元器件的性能、可靠性和寿…

Mysql进阶(一)Mysql执行流程与架构

文章目录 一句查询语句是如何执行的&#xff1f;通信协议通信方式查询缓存词法语法解析和预处理&#xff08;解析器、预处理器&#xff09;查询优化器与查询执行计划什么是优化器优化器可以做什么优化器执行结果 存储引擎基本介绍存储引擎比较如何选择存储引擎 一条更新SQL是如…

java语法(一)基本概念、数据类型、字符串类、集合

文章目录 java程序运行流程JDK、JRE、JVM的关系 java数据类型基本数据类型基本数据类型之间的转换 引用数据类型数组类Java Bean重写 equals和hashcode 接口接口与类之间的关系 内置包装类装箱和拆箱包装类的应用Object类toString()equals()方法getClass() 方法接收任意引用类型…

【蓝桥杯选拔赛真题56】Scratch画笔涂色 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

目录 scratch画笔涂色 一、题目要求 编程实现 二、案例分析 1、角色分析

STM32 匿名助手提升电机控制调试效率(下位机代码和上位机操作演示)

目录 前言 通信协议选择 上位机配置实现 下位机代码实现 通信效果演示 总结 前言 前面介绍了通过VOFA上传变量并显示成波形方便调试的方法&#xff0c;VOFA上传的是浮点&#xff0c;一个浮点需要4个byte才能够表示&#xff0c;这对本就不是很快的串口带来说有不小负担&am…

Django框架之模型自定义管理器

类属性 objects 是manager类的一个对象&#xff0c;作用是与数据库进行交互。 当定义模型类没有指定管理器&#xff0c;django会为模型创建objects管理器。 表结构与数据 CREATE TABLE myapp_grades (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) NOT NULL,boy_num…

疫情红利出清后如何破局?华大智造的三场突围战

作者&#xff5c;严睿 华大智造&#xff08;688114.SH&#xff09;上市后的首份年报&#xff0c;亮点颇多。 比如2022年公司营收再创新高&#xff0c;达到42.31亿元&#xff0c;净利润同比增长3倍余&#xff1b;比如2022年度华大智造基因测序仪全球装机量达到600&#xff0c;…

处理日期和时间的 chrono 库

C11 中提供了日期和时间相关的库 chrono&#xff0c;通过 chrono 库可以很方便地处理日期和时间&#xff0c;为程序的开发提供了便利。chrono 库主要包含三种类型的类&#xff1a;时间间隔duration、时钟clocks、时间点time point。 1. Ratio 时间精度(节拍) std::chrono::ra…

helm和chart

Helm helm是Kubernetes 应用的包管理工具&#xff0c;主要用来管理 Charts&#xff0c;类似Linux系统的yum。Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata&#xff0c;以便于应用程序的分发。 he…

Linux驱动编程(总线设备驱动模型)

一、驱动编写的3种方法 1、传统写法 使用哪个引脚&#xff0c;怎么操作引脚&#xff0c;都写死在代码中。最简单&#xff0c;不考虑扩展性&#xff0c;可以快速实现功能。修改引脚时&#xff0c;需要重新编译。 2、总线设备驱动模型 引入 platform_device/platform_driver&am…

【.NET基础加强第八课--委托】

.NET基础加强第八课--委托 委托&#xff08;Delegate&#xff09;委托操作顺序实例多播委托—委托链实例实例委托传值 委托&#xff08;Delegate&#xff09; 委托&#xff08;Delegate&#xff09; 是存有对某个方法的引用的一种引用类型变量 委托操作顺序 1,定义一个委托类…

SpringCloud------Eureka修改实例显示信息、服务发现Discovery、自我保护(六)

SpringCloud------Eureka修改实例显示信息、服务发现Discovery、自我保护&#xff08;六&#xff09; 1.actuator微服务信息完善 2.服务发现Discovery 3.Eureka自我保护 actuator微服务信息完善 web和actuator依赖用于图形化监控 1.主机名称&#xff1a;服务名称修改 新增…

新库上线 | CnOpenData缺陷产品召回数据

缺陷产品召回数据 一、数据简介 缺陷产品召回&#xff0c;是指缺陷产品的生产商、销售商、进口商在得知其生产、销售或进口的产品存在可能引发消费者健康、安全问题的缺陷时&#xff0c;依法向职能部门报告&#xff0c;及时通知消费者&#xff0c;设法从市场上、消费者手中收回…

快速跑通环信IM Android Demo

1、以Android 4.0.0 Demo为例 https://www.easemob.com/download/demo &#xff08;下载别的版本的demo 可以修改版本号直接下载就就可以&#xff09; https://downloadsdk.easemob.com/downloads/easemob-sdk-4.0.0.zip 运行时遇到以下报错在项目build.gradle中添加运行时遇…

SAXS测试在材料结构表征中的应用与优势

SAXS测试在材料结构表征中的应用与优势 SAXS是指小角X射线散射&#xff0c;是一种用于研究物质结构的重要技术。SAXS技术可以用于表征各种材料的结构&#xff0c;如聚合物、胶体、纳米粒子等。本文将介绍SAXS测试在材料测试表征中的应用&#xff0c;包括SAXS曲线、比表面积、粒…

MySQL基础(四)运算符

1. 算术运算符 算术运算符主要用于数学运算&#xff0c;其可以连接运算符前后的两个数值或表达式&#xff0c;对数值或表达式进行加&#xff08;&#xff09;、减&#xff08;-&#xff09;、乘&#xff08;*&#xff09;、除&#xff08;/&#xff09;和取模&#xff08;%&am…

选对信息化管理系统,企业运营效率大幅提升!

随着信息化的发展&#xff0c;企业信息化管理系统已经成为企业独立商业活动和发展的重要基础设施之一。然而&#xff0c;在众多的信息化管理系统中&#xff0c;选择一款适合企业的信息化管理系统并不是一件易事&#xff0c;本文将从选型的角度&#xff0c;为企业提供一些选对合…

第二章 图像基本运算及变换

文章目录 前言一、图像运算1. 加减乘除2. 位运算 二、翻转与旋转1.翻转2.旋转 三、仿射变换1. 介绍2. 变换的数学表达2.1 平移2.2 缩放2.3 旋转 3. 变换矩阵4. 变换叠加5. 变换矩阵的逆推6.OpenCV实现以及手动实现6.1 手动实现6.2OpenCV实现 7.向量空间----补充 四、透视变换1.…

人脉变现小程序裂变定制开发

人脉变现小程序裂变定制开发可以提供以下服务&#xff1a; 需求分析&#xff1a;了解客户的业务需求和目标&#xff0c;并为其量身定制开发方案&#xff0c;提供专业的建议和意见。 UI/UX设计&#xff1a;根据客户的品牌形象和用户体验要求&#xff0c;设计出符合客户需…

简单实现基于UDP与TCP的回显服务器

目录 前言UDP 版的回显服务器需要用到的 api服务端客户端UDP 版本的字典客户端和字典服务器 TCP 版的回显服务器需要用到的 api服务器客户端对服务器进行改进(使用线程池)TCP 版本的字典客户端和字典服务器 前言 我们写网络程序, 主要编写的是应用层代码. 真正要发送这个数据,…