码迷,mamicode.com
首页 > 其他好文 > 详细

uC/OS-II同步行为----事件标志组

时间:2015-11-20 12:41:50      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

主要API讲解:  

  1、OS_FLAG_GRP *OSFlagCreate( OS_FLAGS flags, //其中参数OS_FLAGS flags是信号的初始值

                     INT8U *perr  //参数 *perr 是错误信息

                   ); //返回值为OS_FLAG_GRP型的指针,即为创建的信号量集的标志组的指针

  2、OS_FLAGS OSFlagPost( OS_FLAG_GRP *pgrp,  //发送信号量集的指针

                OS_FLAGS flags,  //选择要发送的信号 :例如:给第1位发信号 0010  同样把2强制转化为OS_FLAGS型的数据,

                INT8U opt,    //信号有效的选项 信号置1  OS_FLAG_SET为置1  OS_FLAG_CLR为置 

                INT8U *perr );  

  3、OS_FLAGS OSFlagPend( OS_FLAG_GRP *pgrp,  //请求信号量集指针

                 OS_FLAGS flags,  //过滤器 例如:请求第0和第1位信号 0011 这里是把数据3强制转化为OS_FLAGS类型的数据,(OS_FLAGS )3;

                INT8U wait_type,//OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME, 信号全是1表示信号有效 参数OS_FLAG_CONSUME表示当

                         //任务等待的事件发生后,清除相应的事件标志位

                         //OS_FLAG_WAIT_SET_ALL:实现的是逻辑与的功能OS_FLAG_WAIT_SET_ANY实现逻辑或的功能

                INT32U timeout, //等待时限,0表示无限等待

                INT8U *perr );

事件标志组例程讲解( http://www.2cto.com/os/201412/356927.html ):

 

试想如下情况,有A、B、C三个事件,当A、B都满足某一条件(或执行某一动作)后C才能得到运行(持续运行或运行一次后继续等待A、B条件再次满足后再运行)。

如果需要实现这样的功能,就可以用事件标志组来实现了!

具体看实例:

//定义一个事件标志
OS_FLAG_GRP *Sem_Flg = 0;

//LED0任务
void led0_task(void *pdata)

INT8U err = 0; 
pdata = pdata;

//创建一个事件标志
Sem_Flg = OSFlagCreate(0, &err);

while (1)

delay_ms(5000u);

//发送信号量集
OSFlagPost( 
Sem_Flg,
(OS_FLAGS)1, //给第0位发信号
OS_FLAG_SET, //信号量置1
&err
);
}
}

//LED1任务
void led1_task(void *pdata)
{
INT8U err = 0u; 

while (1)

delay_ms(1000u);

//发送信号量集
OSFlagPost( 
Sem_Flg,
(OS_FLAGS)2, //给第1位发信号
OS_FLAG_SET, //信号量置1
&err
);
}
}

//UART任务
void uart_task(void *pdata)
{
INT8U err = 0;
pdata = pdata;

while (1)

//请求信号量集
OSFlagPend(
Sem_Flg, 
(OS_FLAGS)0x03, //请求第0位和第1位信号
OS_FLAG_WAIT_SET_ALL //第0位和1位均置1时为有效,否则任务挂在这里
| OS_FLAG_CONSUME, //清除指定事件标志位
0, //无限等待,直到收到信号为止
&err
);

printf("run uart_task\r\n"); //每5秒钟打印一次
}
}

其中OS_FLAG_WAIT_SET_ALL如果改成OS_FLAG_WAIT_SET_ANY的话,

则表示第0位或第1位置1时为有效,否则任务挂在这里。

如果不加OS_FLAG_CONSUME的话,则表示一旦条件成立,打印会一直进行下去,

而不需要等待条件再次成立才能打印!

uC/OS-II同步行为----事件标志组

标签:

原文地址:http://www.cnblogs.com/zhangkai163/p/4980123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!