文档章节

16.2-uC/OS-III同步 (事件标志组)

o
 osc_1ee7cxmx
发布于 2018/08/06 16:18
字数 1098
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

事件标志组

1.当任务要与多个事件同步时可以使用事件标志。若其中的任意一
个事件发生时任务被就绪, 叫做逻辑或
(OR)。若所有的事件都发生时
任务被就绪,叫做逻辑与(
AND)。

2.用户可以创建任意个事件标志组( 限制于RAM)。 uC/OS-III中与
事件标志组相关的函数都是以
OSFlag???()为前缀。与事件标志组相
关的函数代码都在
OS_FLAG.C中。

3.设置OS_CFG.H中的OS_CFG_FLAG_EN1开启事件标志组功能。

1)事件标志组是uC/OS-III的内核对象,以OS_FLAG_GRP为数据类型(见 OS.H)。 它可以是 8位, 16位, 32位,

决定于OS_TYPE.H中所定义的OS_FLAGS。 事件标志组中的位是任务所等待事件是否发生的标志。事件标志组必须在创建后使用。

2) 任务或ISR可以提交标志。 然而, 只有任务可以将在事件标志组中等待的其它任务删除,

取消等待,只有任务才能让任务在事件标志组中等待。

3) 任务可以等待事件标志组中的任意个位被设置。 等待也可以被设置期限,以时基为单位。

4)任务等待事件标志组中的位,可以被设置为OR模式, 或者是AND模式。

函数名 功能
OSFlagCreate() 创建一个事件标志组
OSFlagDel() 删除一个事件标志组
OSFlagPend() 在事件标志组中挂起
OSFlagPendAbort() 取消等待
OSFlagPendGetFalgsRdy() 获得事件标志组中导致任务被就绪的位
OSFlagPost() 提交标志到事件标志组

4.使用事件标志组

当任务或ISR提交标志到事件标志组,满足条件的任务会被就绪

事件标志组中位的含义由用户定义,应用中可以有多个事件标志
组。 在事件标志组中, 可以定义位
0表示温度过低( 由温度传感器接
收),位
1表示电压过低,位 2表示某个开关被按下等。任务或 ISR
检测这些传感器并调用OSFlagPost()设置相应的标志位。 任务可以调
OSFlagPend()检测相应的标志是否发生。

5.事件标志组通常用于表示的短暂的事件或状态信息。通常用不同
的事件标志组处理。
 

ISR或任务可以测量一些状态信息,例如温度、转速、电压等。
用于状态信息时一般不设置等待时限。
ISR或任务可以测量一些短暂的事件,如按下开关、爆炸等。
用于短暂事件时一般设置了等待时限。

6.事件标志组内部结构

用户可以创建任意个事件标志组(仅限制于处理器的 RAM)。通
过设置
OS_CFG.H中的 OS_CFG_FLAG_EN1开启事件标志组功
能。

用户代码不能直接访问事件标志组,必须通过uC/OS-III提供的函
数访问事件标志组。

7.多任务同步

通过广播信号量实现多任务同步是通用的方法。显然的,在单CPU
系统中, 同一时间只能执行一个任务。 然而, 多个任务可以同时被就
绪。 这叫做多任务同步。 然而, 需要同步一些不需要接收广播的信号
量的任务,解决这个问题的办法是将信号量和时间标志组同时用于同
假定左边任务的优先级比右边任务的优先级低。

1)右边的每个任务都需要跟事件标志组的位对应。
2)右边任务需等待信号量才能被就绪。
3)当事件标志组中与需要同步的任务对应位都被置位后,
左边任务才能广播信号量。

4)左边任务广播信号量给右边任务。

信号量和任务信号量中都有信号量计数值表示该信号量还可以被
分配几次。
ISR或任务需要标记一个任务时,推荐使用任务信号量
因为这可以避免定义一个外部信号量且更为有效。
当任务需要与一个或多个事件同步时使用事件标志组。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

Buffer的创建及使用源码分析——ByteBuffer为例

目录 Buffer概述 Buffer的创建 Buffer的使用 总结 参考资料 Buffer概述 注:全文以ByteBuffer类为例说明 在Java中提供了7种类型的Buffer,每一种类型的Buffer根据分配内存的方式不同又可以分为...

osc_zoa046qb
10分钟前
11
0
《 ZooKeeper : Wait-free coordination for Internet-scale systems 》论文研读

Zookeeper 研读 说明:本文为论文 《 ZooKeeper : Wait-free coordination for Internet-scale systems 》 的个人理解,难免有理解不到位之处,欢迎交流与指正 。 论文地址:Zookeeper Paper...

osc_4isxawz4
11分钟前
8
0
利用__new__实现单例模式

26 利用__new__实现单例模式 python当中有很多方法都可以实现单例模式, 但利用__new__无疑是最推荐的方式. 代码如下: class Demo:is_instance = Nonedef __new__(cls, *args, **kwargs...

_Change_
12分钟前
0
0
如何白嫖微软Azure12个月及避坑指南

Azure是微软提供的一个云服务平台。是全球除了AWS外最大的云服务提供商。Azure是微软除了windows之外另外一个王牌,微软错过了移动端,还好抓住了云服务。这里的Azure是Azure国际不是Azure中...

osc_dwuu5jqk
12分钟前
0
0
Mybatis源码初探——优雅精良的骨架

@ 目录 前言 精良的Mybatis骨架 宏观设计 基础支撑 日志 日志的加载 日志的使用 数据源 数据源的创建 池化技术原理 数据结构 获取连接 回收连接 缓存 缓存的实现 CacheKey 反射 总结 前言 My...

osc_r9wwwi0j
14分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部