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

事件标志组

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或任务需要标记一个任务时,推荐使用任务信号量
因为这可以避免定义一个外部信号量且更为有效。
当任务需要与一个或多个事件同步时使用事件标志组。

 

posted @ 2018-08-06 16:18  西贡小傻  Views(1011)  Comments(0Edit  收藏  举报