以下内容转载自安富莱电子: http://forum.armfly.com/forum.php

前面的章节我们已经讲解了任务管理和时间管理,从本章节开始讲解任务间的通信和同步机制。首先
讲解任务间的通信和同步机制之一,事件标志组。

时间标志组:移植了三个小型嵌入式操作系统了,应该明确一下这个时间标志组用来干什么了。

事件标志组----它是用来同步几个任务,协调几个任务工作而设立的。打个比方你现在要打个电话,打电话这个任务要执行,你必须有手机吧!那你要先执行买手机这个任务,你手机有了,没话费~你也打不了吧~,也就是说打电话这个任务要等买手机这个任务和充话费这个任务都完成了以后你才能去开始打电话这个任务。事件标志组就是用来标志买手机或者充话费这两个任务完成了没有。完成了的话他们会相应的置位事件标志组里面的某些标志位。那么打电话这个任务。发现事件标志组里面买手机对应的位和充话费对应的位都置位了以后就明白,现在可以开始打电话了~!实际中比如你想要读数据,那你肯定要等数据采集更新好了以后你去读才有意义吧~所以数据采集和读取数据这两个任务也可以用事件标志组来实现。/*此处摘自:http://blog.csdn.net/u011352311/article/details/37601145*/

这个在裸机操作中可以使用全局变量作为标志位来实现,但是那样会带来很多麻烦,os应用编程,要防止多任务的访问冲突,而事件标志组,得以解决这个问题,我必须收到你前面事件的完成,才做后面的事情。
为什么要使用事件标志
事件标志组是实现多任务同步的有效机制之一。也许有不理解的初学者会问采用事件标志组多麻烦,
搞个全局变量不是更简单,其实不然。在裸机编程时,使用全局变量的确比较方便,但是在加上 RTOS 后
就是另一种情况了。 使用全局变量相比事件标志组主要有如下三个问题:
 使用事件标志组可以让 RTOS 内核有效的管理任务,全局变量是无法做到的,任务的超时等机制需要
用户自己去实现。
 使用了全局变量就要防止多任务的访问冲突,使用事件标志组已经处理好了这个问题。 用户无需担心。
 使用事件标志组可以有效的解决中断服务程序和任务之间的同步问题。
RTX 任务间事件标志组的实现
任务间事件标志组的实现是指各个任务之间使用事件标志组实现任务的通信或者同步机制。
RTX 每个任务创建的时候,会自动创建 16 个事件标志,事件标志被存储到每个任务的任务控制块中。
也就是说每个任务支持 16 个事件标志。 下面我们通过如下的框图来说明一下 RTX 事件标志的实现,让大家有一个形象的认识。

运行条件:
 创建 2 个任务 Task1 和 Task2
运行过程描述如下:
 任务 Task1 运行过程中调用函数 os_evt_wait_and,等待事件标志位被设置,任务 Task1 由运行态进
入到挂起态
 任务 Task2 设置了任务 Task1 的事件标志,任务 Task1 由挂起态进入到就绪态,在调度器的作用下
由就绪态又进入到运行态。
上面就是一个简单 RTX 任务间事件标志通信过程。

RTX 中断方式事件标志组的实现
RTX 中断方式事件标志组的实现是指中断函数和 RTX 任务之间使用事件标志。 下面我们通过如下的
框图来说明一下 RTX 事件标志的实现,让大家有一个形象的认识。

运行条件:
 创建 1 个任务和一个串口接收中断
运行过程描述如下:

 任务 Task1 运行过程中调用函数 os_evt_wait_and,等待事件标志位被设置,任务 Task1 由运行态进
入到挂起态
 Task1 挂起的情况下,串口接收到数据进入到了串口中断服务程序,在串口中断服务程序中设置 Task1
的事件标志,任务 Task1 由挂起态进入到就绪态,在调度器的作用下由就绪态又进入到运行态。
上面就是一个简单 RTX 中断方式事件标志通信过程。 实际应用中,中断方式的消息机制切记注意以下四个
个问题:
 中断函数的执行时间越短越好,防止其它低于这个中断优先级的异常不能得到及时响应。
 实际应用中,建议不要在中断中实现消息处理,用户可以在中断服务程序里面发送消息通知任务,在
任务中实现消息处理,这样可以有效的保证中断服务程序的实时响应。同时此任务也需要设置为高优
先级,以便退出中断函数后任务可以得到及时执行。
 中断服务程序中一定要调用专用于中断的事件标志设置函数 isr_evt_set。
 在 RTX 操作系统中实现中断函数跟裸机编程是一样的。
 另外强烈推荐用户将 Cortex-M3 内核的 STM32F103 和 Cortex-M4 内核的 STM32F407 的
NVIC 优先级分组设置为 4,即:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这样中断
优先级的管理将非常方便。
 用户要在 RTX 多任务开启前就设置好优先级分组,一旦设置好切记不可再修改。
事件标志组 API 函数
使用如下 6 个函数可以实现 RTX 的事件标志组:
 os_evt_clr
 os_evt_get
 os_evt_set
 os_evt_wait_and
 os_evt_wait_or
 isr_evt_set

这里我们重点的说一下函数 os_evt_set,isr_evt_set 和 os_evt_wait_and,因为本章节配套的例子使用的是这三个函数。 
函数 os_evt_set
函数原型:
void os_evt_set (
U16 event_flags, /* 16 位的事件标志设置 */
OS_TID task ); /* 要设置事件标志的任务 ID */
函数描述:
函数 os_evt_set 用于设置指定任务的事件标志。
 第1个参数表示16个可设置的事件标志位。因为RTX的每个任务创建时有16个可设置的事件标志,
这里用 U16 类型的变量 event_flag 就可以表示,变量 event_flag 的某个位设置为 1,那么指定 RTX
任务的事件标志相应位就设置为 1。 变量 event_flag 设置为 0 的位对 RTX 任务的事件标志相应位没
有影响。比如设置变量 event_flag = 0x0003 就表示将 RTX 任务事件标志的位 0 和位 1 设置为 1,
其余位没有变化。
 第 2 个参数是任务 ID。
使用这个函数要注意以下问题:
1. 此函数是用于任务代码中调用的,故不可以在中断服务程序中调用此函数,中断服务程序中使用的是
isr_evt_set

函数 isr_evt_set
函数原型:
void isr_evt_set (
U16 event_flags, /* 16 位的事件标志设置 */
OS_TID task ); /* 要设置事件标志的任务 ID */
函数描述:
函数 isr_evt_set 用于设置指定任务的事件标志。
 第1个参数表示16个可设置的事件标志位。因为RTX的每个任务创建时有16个可设置的事件标志,
这里用 U16 类型的变量 event_flag 就可以表示,变量 event_flag 的某个位设置为 1,那么指定 RTX
任务的事件标志相应位就设置为 1。 变量 event_flag 设置为 0 的位对 RTX 任务的事件标志相应位没
有影响。比如设置变量 event_flag = 0x0003 就表示将 RTX 任务事件标志的位 0 和位 1 设置为 1,
其余位没有变化。
 第 2 个参数是任务 ID。
使用这个函数要注意以下问题:
1. 此函数是用于中断服务程序中调用的,故不可以在任务中调用此函数,任务中使用的是 os_evt_set。
2. 事件标志函数 isr_evt_set 的调用不能太频繁,太频繁的话会大大增加系统内核的开销,会造成事件标
志得不到及时处理从而造成丢失事件标志的情况。

函数 os_evt_wait_and
函数原型:
OS_RESULT os_evt_wait_and (
U16 wait_flags, /* 16 位的事件标志等待 */
U16 timeout ); /* 超时时间设置 */
函数描述:
函数 os_evt_wait_and 用于等待事件标志被设置。

 第 1 个参数表示任务等待的事件标志位。因为 RTX 的每个任务创建时有 16 个可以设置的事件标志,
这里用 U16 类型的变量 event_flag 就可以设置,变量 event_flag 的那位设置为 1,那么 RTX 任务
的事件标志就等待那个位被设置为 1。而且要所有要求的位都被设置为 1 才可以。比如设置变量
event_flag = 0x0003 就表示 RTX 任务在等待事件标志的位 0 和位 1 都被设置为 1。
 第 2 个参数表示设在的等待时间,范围 0-0xFFFF,当参数设置为 0-0xFFFE 时,表示等这么多个时
钟节拍,参数设置为 0xFFFF 时表示无限等待直到事件标志满足要求。
 函数返回 OS_R_EVT 表示等待的事件标志位都被设置了,也就是返回成功。返回 OS_R_TMO 表示
超时。
使用这个函数要注意以下问题:
1. 当要求的事件标志位都被设置为 1 时或者设置的超时时间溢出时,函数 os_evt_wait_and 才会返回(聪明的你应该猜测到后缀and和or函数的区别了吧)。
2. 如果函数 os_evt_wait_and 返回前所要求的事件标志位都设置了,那么此函数会在返回前将相应的事
件标志位清零,其它位不受此影响。如果初学者不是太理解这个问题,可以看本章节配套的例子,这
样会有一个清晰的认识。

代码练习场:

串口输出:

转载于:https://www.cnblogs.com/yangguang-it/p/7339266.html

RTX——第13章 事件标志组相关推荐

  1. 用事件标志组实现多事件的单向同步

    文章目录 1 用事件标志组实现多事件的单向同步 1 用事件标志组实现多事件的单向同步 问题需求: 某一任务等待事件中一个或多个事件同时发生. 解决方案: 事件发生时,设置指定事件标志位,任务4等待所有 ...

  2. 事件标志组解决任务间资源共享问题

    文章目录 1 事件标志组解决任务间资源共享问题 1.1 工作原理 1.2 分析 1 事件标志组解决任务间资源共享问题 1.1 工作原理 tinyOS的事件标志组实现: 代码: /*** @brief ...

  3. 事件标志组的删除与状态查询

    文章目录 1 事件标志组的删除与状态查询 1.1 设计实现 1 事件标志组的删除与状态查询 1.1 设计实现 事件标志组的删除: 状态查询: 参考资料: [李述铜]从0到1自己动手写嵌入式操作系统

  4. 事件标志组的等待与通知

    文章目录 1 事件标志组的等待与通知 1.1 设计需求 1.2 设计实现 1 事件标志组的等待与通知 1.1 设计需求 当事件标志位发生时: 没有任务等待,设置相应的事件标志. 有任务等待时,唤醒等待 ...

  5. 事件标志组的原理与创建

    文章目录 1 事件标志组的原理与创建 1.1 问题概述 1.2 设计原理 1.3 设计实现 1 事件标志组的原理与创建 1.1 问题概述 如何在中断ISR与任务之间传递多个事件标志? 可以通过事件标志 ...

  6. FreeRTOS 事件标志组 ——提高篇

    假设你已经看过FreeRTOS 事件标志组这篇随笔了. 之前的基础篇,真的就只是简单了解一下,相当于大学实验室的实验,但是,我们实际公司项目中,需要更多地思考,就算我们之前只是学习了基础概念以及基础语 ...

  7. RTX5 | 事件标志组04 - 线程同步(逻辑与)

    文章目录 一.前言 二.实验目的 三.API 3.1.osEventFlagsWait 四.代码 4.1.main.h 4.2.main.c 五.Event Recorder 5.1.分别长按按键KE ...

  8. RTX5 | 事件标志组03 - 线程同步(逻辑或)

    一.前言 事件标志组是独自存在的,线程标志组只是线程的一部分.事件标志组的使用方法与线程标志组的使用方法一样,学会使用线程标志组就等于学会使用事件标志组,反之亦然.当线程退出之后,其线程标志组就会消失 ...

  9. RTX5 | 事件标志组02 - 置位事件标志组,并获取事件标志组的值

    文章目录 一.前言 二.实验目的 三.API 3.1.osEventFlagsSet 3.2.osEventFlagsGet 四.代码 4.1.main.h 4.2.main.c 五.Event Re ...

  10. RTX5 | 事件标志组01 - 创建事件标志组

    文章目录 一.前言 二.实验目的 三.API 3.1.osEventFlagsAttr_t 3.2.osEventFlagsNew 四.代码 4.1.main.h 4.2.main.c 五.Event ...

最新文章

  1. 值得FS去的英雄副本
  2. c语言 lis的nlogn算法,ACM竞赛高级算法讲义.doc
  3. PE头里的东西更多。。。越看越恶心了,我都不想看了
  4. 【Paper】2018_多无人机协同编队控制算法研究_林倩玉
  5. Dedecms 最新版漏洞收集并复现学习
  6. 记一次newCachedThreadPool造成的导入导出事故
  7. 经典排序算法(十)--希尔排序Shell Sort
  8. D3D处理2D图像: NV12格式及其转换(1)
  9. 在CentOS 8上安装使用Firefox的视频播放功能(FFmpeg)
  10. windows移动硬盘接到mac上使用(加载ntfs移动硬盘)
  11. 计算力矩——计算关节力矩以平衡端点力和力矩
  12. linux内top命令,Linux中的top命令的详细解释
  13. 408 操作系统 操作系统概述
  14. 基本算法4.1堆积木详细题解
  15. 声学——声源定位阅读笔记
  16. 淘宝电商:淘宝卖家如何快速提升店铺自然搜索流量?
  17. linux内核时间管理(一) : 时间概念和延迟操作
  18. LabVIEW的万金油框架
  19. 嵌入式(十四)——Makefile编写及多级目录
  20. GBase 8c PGXC_CLASS系统表

热门文章

  1. Spring Boot学习记之Maven
  2. Linux20180421五周第二次课(4月19日)
  3. WebApp的自动测试工具: Jenkins
  4. ORACLE 视图的 with check option
  5. 《项目百态》读感系列”苏式风格“
  6. Android开发如何展示编译时间到apk
  7. BZOJ1911[APIO2010] 特别行动队
  8. 前端传递数组给后端,多个相同key,对应不同值
  9. linux 性能测试 多线程,sysbench - linux多线程性能测试工具
  10. lol最强最高输出的adc_lol最强adc大盘点 lol大后期胜率最高的adc除了薇恩还有谁...