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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值