16.2-uC/OS-III同步 (事件标志组)
事件标志组
1.当任务要与多个事件同步时可以使用事件标志。若其中的任意一
个事件发生时任务被就绪, 叫做逻辑或(OR)。若所有的事件都发生时
任务被就绪,叫做逻辑与( AND)。
2.用户可以创建任意个事件标志组( 限制于RAM)。 uC/OS-III中与
事件标志组相关的函数都是以 OSFlag???()为前缀。与事件标志组相
关的函数代码都在OS_FLAG.C中。
3.设置OS_CFG.H中的OS_CFG_FLAG_EN为1开启事件标志组功能。
( 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_EN为 1开启事件标志组功能。
用户代码不能直接访问事件标志组,必须通过uC/OS-III提供的函
数访问事件标志组。
7.多任务同步
通过广播信号量实现多任务同步是通用的方法。显然的,在单CPU
系统中, 同一时间只能执行一个任务。 然而, 多个任务可以同时被就
绪。 这叫做多任务同步。 然而, 需要同步一些不需要接收广播的信号
量的任务,解决这个问题的办法是将信号量和时间标志组同时用于同
步。假定左边任务的优先级比右边任务的优先级低。
( 1)右边的每个任务都需要跟事件标志组的位对应。
( 2)右边任务需等待信号量才能被就绪。
( 3)当事件标志组中与需要同步的任务对应位都被置位后,左边任务才能广播信号量。
( 4)左边任务广播信号量给右边任务。
信号量和任务信号量中都有信号量计数值表示该信号量还可以被
分配几次。若ISR或任务需要标记一个任务时,推荐使用任务信号量
因为这可以避免定义一个外部信号量且更为有效。
当任务需要与一个或多个事件同步时使用事件标志组。