创建信号量集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);//全部信号量清零
}
}