频道栏目
首页 > 系统 > 其他 > 正文

μC/OS-II事件标志组的入门级使用方法

2014-12-01 09:37:23         来源:可乐虎博客  
收藏   我要投稿

试想如下情况,有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的话,则表示一旦条件成立,打印会一直进行下去,

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

上一篇:nginx版本升级
下一篇:nginx基本配置分析
相关文章
图文推荐
文章
推荐
热门新闻

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站