uCOS | 事件

今天说一下uCOS的事件。

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

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

其实事件有点像是一个标志位,某件事情发生了,就将相应的标志位置1,查看标志位就可以知道事件有没有发生。

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

接下来说一下事件的几个函数。

1、事件创建函数 OSFlagCreate()

OSFlagCreate ((OS_FLAG_GRP *)&flag_grp, //指向事件标志组的指针

(CPU_CHAR *)"FLAG For Test", //事件标志组的名字

(OS_FLAGS )0, //事件标志组的初始值

(OS_ERR *)&err); //返回错误类型

2、事件删除函数 OSFlagDel()

OS_OBJ_QTY OSFlagDel (OS_FLAG_GRP *p_grp,//事件标志组指针

OS_OPT opt, //选项

OS_ERR *p_err)//返回错误类型

3、事件设置函数 OSFlagPost()

OS_FLAGS OSFlagPost (OS_FLAG_GRP *p_grp,//事件标志组指针

OS_FLAGS flags,//选定要操作的标志位

OS_OPT opt, //选项

OS_ERR *p_err)//返回错误类型

4、事件等待函数 OSFlagPend()

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) //返回错误类型

这个稍微注意一下选项这里,我们可以看一下他的代码

switch(opt){ //根据选项分类处理

case OS_OPT_PEND_FLAG_CLR_ALL: //如果选项在预期内

case OS_OPT_PEND_FLAG_CLR_ANY:

case OS_OPT_PEND_FLAG_SET_ALL:

case OS_OPT_PEND_FLAG_SET_ANY:

case OS_OPT_PEND_FLAG_CLR_ALL | OS_OPT_PEND_FLAG_CONSUME:

case OS_OPT_PEND_FLAG_CLR_ANY | OS_OPT_PEND_FLAG_CONSUME:

case OS_OPT_PEND_FLAG_SET_ALL | OS_OPT_PEND_FLAG_CONSUME:

case OS_OPT_PEND_FLAG_SET_ANY | OS_OPT_PEND_FLAG_CONSUME:

case OS_OPT_PEND_FLAG_CLR_ALL | OS_OPT_PEND_NON_BLOCKING:

case OS_OPT_PEND_FLAG_CLR_ANY | OS_OPT_PEND_NON_BLOCKING:

case OS_OPT_PEND_FLAG_SET_ALL | OS_OPT_PEND_NON_BLOCKING:

case OS_OPT_PEND_FLAG_SET_ANY | OS_OPT_PEND_NON_BLOCKING:

case OS_OPT_PEND_FLAG_CLR_ALL | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_NON_BLOCKING:

case OS_OPT_PEND_FLAG_CLR_ANY | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_NON_BLOCKING:

case OS_OPT_PEND_FLAG_SET_ALL | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_NON_BLOCKING:

case OS_OPT_PEND_FLAG_SET_ANY | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_NON_BLOCKING:

break; //直接跳出

可以选择清除或者是设置任何一件(any)事情发生就触发,也可以选择等待所有(all)事件都发生的时候再触发,还可以选择等待事件是否要阻塞。

总的来说,和之前的操作相似。

本文分享自微信公众号 - 电子技术研习社(zjf18770701843),作者:小小飞飞哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • uCOS | 消息队列与信号量

    队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从...

    飞哥
  • 创建任务与任务管理

    上一次我们说过,在裸机编程中,通过while(1)大循环来按顺序执行我们的程序,除了中断之外,后面的程序是不可能打断前面的程序来执行的。而在我们的uC/OS I...

    飞哥
  • 走进uCOS III操作系统

    写在前面 最近的更新频率有些慢,因为有许多东西在网上是有大量资料的,所以我想尽量多写一点带有思考性的,或者是遇到的一些问题,少写一些同质化的东西。另外,我...

    飞哥
  • 【大牛经验】搜狗商业平台Java技术实践

    搜狗商业平台Java技术实践 Java自1995年问世以来,已历经20多年岁月。20年来,IT技术风起云涌,Java始终以其可移植性、跨平台性、生态系统完备性等...

    Java帮帮
  • 快速构建智能运维问答机器人的实践

    1、最近在和研发同学在探讨关于运维还需要补充的功能的时候。研发有提到希望我们运维能将目前已有的运维能力(运维各个对外的子系统、数据库的架构选型策略、各种基础组件...

    二狗不要跑
  • 二本毕业,我是如何成为BAT 安卓开发工程师?

    13年,我从一个二本学院的化学专业毕业。许多同学毕业后都是在制药工厂上班,朝九晚六,拿着微薄的工资。那个时候的自己很迷茫,总觉得未来不该如此淡然无味。一波波得招...

    Android技术干货分享
  • GitOps与ChatOps的落地实践

    说到 GitOps 和 ChatOps ,那就不得不谈到 DevOps 。DevOps 作为一种文化,旨在促进开发、测试和运维人员之间的沟通与协作。而促进合作的...

    CNCF
  • layui使用心得

    表单控件样式没生效, 因为没引入form. 1 layui.use('form', function(){ 2 var form...

    用户1216491
  • 【2】大学里刚入坑的新生码农们注意了(上)

    上一篇章,咖啡君给各位介绍了程序猿必备的基本装备。这一篇,我们来聊聊大学里刚入坑的新生码农们需要注意哪些?

    代码咖啡
  • SparkSQL中产生笛卡尔积的几种典型场景以及处理策略

    【前言:如果你经常使用Spark SQL进行数据的处理分析,那么对笛卡尔积的危害性一定不陌生,比如大量占用集群资源导致其他任务无法正常执行,甚至导致节点宕机。那...

    大数据学习与分享

扫码关注云+社区

领取腾讯云代金券