前言
UCOSIII实时操作系统------事件标志组
提示:以下是本篇文章正文内容,下面案例可供参考
一、概述
前面讲述了UCOSIII的信号量、互斥信号量,它们都可以完成任务的同步。但是有时候一个任务可能需要和多个事件同步,这个时候就需要使用事件标志组。事件标志组与任务之间有两种同步机制:
“或”同步:等待多个事件时,任何一个事件发生 ,任务都被同步,这个就称为“或”同步;
“与”同步:当所有的事件都发生时任务才被同步,这种同步机制被称为“与”同步。
事件标志组是专门管理标志位,一个事件标志组可以管理32个标志位。
在前后台系统,经常会用到标志位,查询标志位是否置位,有明显的缺点,CPU得不到休息,会一直工作查询,增加CPU的功耗。
void main(void)
{
while(1)
{
if(g_iwdg_reset)
{
}
if(g_wwdg_reset)
{
g_wwdg_reset=0;
}
if(g_usart1_event)
{
}
if(g_usart3_event)
{
}
if(g_rtc_wakeup_event)
{
}
if(g_rtc_alarm_event)
{
}
}
}
二、创建事件标志组
代码如下(示例):
void OSFlagCreate (OS_FLAG_GRP *p_grp,
CPU_CHAR *p_name,
OS_FLAGS flags,
OS_ERR *p_err)
参数:
p_grp,事件标志组对象
p_name,事件标志组的名字
flags,事件标志组里所有标志位的初值,默认写0
p_err,返回错误码,没有错误的就返回OS_ERR_NONE
三、等待事件标志组
代码如下(示例):
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)
参数:
p_grp,事件标志组对象
flags,要等待哪些标志位;0x01,则等待bit0;0x05,则等待bit0和bit2;0x83,则等待bit0、bit1、bit7。
timeout,超时时间,默认写0,一直等待
opt,默认写以下格式
OS_OPT_PEND_FLAG_SET_ANY + OS_OPT_PEND_FLAG_CONSUME+OS_OPT_PEND_BLOCKING
OS_OPT_PEND_FLAG_SET_ANY,等待任意一个标志位置位
OS_OPT_PEND_FLAG_CONSUME,等待任意一个标志位成功后,就自动将其清零
OS_OPT_PEND_BLOCKING,阻塞等待
OS_OPT_PEND_FLAG_SET_ALL,等待所有标志位置位,才能跳出阻塞等待
p_ts,用于记录等待事件花了多长时间,默认写NULL,不记录。
p_err,返回错误码,没有错误的就返回OS_ERR_NONE
返回值:
返回等待成功的标志位。
四、设置事件标志组
OS_FLAGS OSFlagPost (OS_FLAG_GRP *p_grp,
OS_FLAGS flags,
OS_OPT opt,
OS_ERR *p_err)
参数:
p_grp,事件标志组对象
flags,结合opt参数一起使用。设置/清零哪些标志位,0x01,则对应bit0;0x05,则对应bit0和bit2;0x83,则对应bit0、bit1、bit7。
opt
.OS_OPT_POST_FLAG_SET,对应的bit置位
.OS_OPT_POST_FLAG_CLR,对应的bit清零
p_err,返回错误码,没有错误的就返回OS_ERR_NONE
总结
以上就是今天要讲的内容,本文仅仅简单介绍了UCOSIII实时操作系统------事件标志组的使用,而UCOSIII实时操作系统还有更多的功能等着我们去挖掘,其他内容请移步博主其他文章或关注博主等待后续发布。