yzai的个人空间 https://passport2.21ic.com/?1197968 [收藏] [复制] [RSS] 我想永生,精神或者肉体最终接受不了时间的洗礼

日志

ucosii信号量集简单记忆及理解

已有 654 次阅读2018-6-19 18:27 |个人分类:ucosii|系统分类:兴趣爱好

创建信号量集flags_key=OSFlagCreate(0,&err);        
信号量集发送函数OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *err);
               具体例如:OSFlagPost(flags_key,1<<(key-1),OS_FLAG_SET,&err);//设置对应的信号量为1
请求信号量集函数OS_FLAGS OSFlagPend(OS_FLAG_GRP*pgrp, OS_FLAGS flags, INT8U wait_type,INT16U timeout, INT8U *err);                        
         具体例如:flags=OSFlagPend(flags_key,0X001F,OS_FLAG_WAIT_SET_ANY,0,&err);//等待信号量
上面两个函数中,flags_key是信号量集标志组指针;1<<(key-1)和0X001F是赋值给信号量集标志组中的OSFlagFlags,OSFlagFlags在定义时,是多少位,就是代表可以传递的信号量是多少个,在上面例程中定义OSFlagFlags是16位无符号整型,则就定义了可使用的信号量是16个,但是0X001F只使用了5个信号量,1<<(key-1)也说明OSFlagFlags只使用了5个按键的信号量。所谓任务向信号量集发信号,就是对信号量集标志组中的OSFlagFlags进行置1或置0,至于对信号量集中的哪些信号进行操作,就是用函数中的参数 flags来指定即任务链表中的OSFlagNodeFlags,上述指定了5位;对指定的信号是置“ 1”还是置“ 0”,用函数中的参数 opt 来指定即任务链表中的OSFlagNodeWaitType( opt =OS_FLAG_SET 为置“1”操作; opt = OS_FLAG_CLR 为置“0”操作)。

//在某一任务中调用信号量集发送函数,则下面函数调用请求信号量集函数后,即可运行下面的程序,并最后将信号量清零
void flags_task(void *pdata)
{       
        u16 flags;       
        u8 err;                                                            
        while(1)
        {
                flags=OSFlagPend(flags_key,0X001F,OS_FLAG_WAIT_SET_ANY,0,&err);//等待信号量
                 if(flags&0X0001)LCD_ShowString(140,162,240,16,16,"KEY0 DOWN  "); 
                if(flags&0X0002)LCD_ShowString(140,162,240,16,16,"KEY1 DOWN  "); 
                if(flags&0X0004)LCD_ShowString(140,162,240,16,16,"KEY2 DOWN  "); 
                if(flags&0X0008)LCD_ShowString(140,162,240,16,16,"KEY_UP DOWN"); 
                if(flags&0X0010)LCD_ShowString(140,162,240,16,16,"TPAD DOWN  "); 

                BEEP=1;
                delay_ms(50);
                BEEP=0;
                OSFlagPost(flags_key,0X001F,OS_FLAG_CLR,&err);//全部信号量清零
         }
}


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)