μC/OS-II事件标志组的入门级使用方法
2014-11-30 23:45
253 查看
试想如下情况,有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的话,则表示一旦条件成立,打印会一直进行下去,
而不需要等待条件再次成立才能打印!
如果需要实现这样的功能,就可以用事件标志组来实现了!
具体看实例:
//定义一个事件标志
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的话,则表示一旦条件成立,打印会一直进行下去,
而不需要等待条件再次成立才能打印!
相关文章推荐
- 详解μC/OS-II软件定时器入门使用方法
- ucos-ii学习笔记——信号量集(事件标志组)的原理及使用
- uC/OS-II实验程序之一(事件标志)
- 为什么不使用动态内存的方法给uC/OS-II任务堆栈分配内存空间?
- UC/OS II 事件标志组管理(二)
- UC/OS II 事件标志组管理(一)
- uC/OS-II同步行为----事件标志组
- 对uC/OSII 事件标志管理的理解
- ASP.NET2.0中的GRIDVIEW控件在使用TemplateField中的LinkButton时如何在RowCommand事件中找到当前行index的方法
- 波动速读入门训练(含黄卡、曼陀螺使用方法)
- 使用uC/OS-II操作系统的短信息电话机
- ATL ActiveX 控件的方法或事件中使用枚举常量
- 下面的示例演示如何使用传递到事件处理方法的 GridViewCommandEventArgs 对象确定引发事件的按钮的命令名。
- 线程同步的三种方法(互斥,事件,临界区) 之一 使用临界区对象
- extjs事件使用方法
- 线程同步的三种方法(互斥,事件,临界区) 之二 使用互斥对象
- 线程同步的三种方法(互斥,事件,临界区) 之三 使用事件对象
- uC/OS - II 之事件控制块学习笔记
- 使用prototype.js的事件处理方法
- 使用handleEvent()方法,action()方法和mouseDown()方法处理事件的JAVA Application程序.