6.信号量集使用步骤*****
1.定义信号量集
OS_FLAG_GRP * flags; //定义信号量集flags
2.创建信号量集
flags=OSFlagCreate(0,&err); //创建信号量集,初始值为0
3.请求信号量集
//在任务1中进行信号量集的请求,并根据请求到的情况进行操作
void uart1_task(void *pdata)
{
u8 err;
u16 flag_receive=0;
while(1)
{
flag_receive=OSFlagPend(flags,0X0003,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,0,&err);//请求信号量集第0位,第1位,两位全部接收到1才可跳过。OS_FLAG_CONSUME表示请求到信号之后清0处理
if(flag_receive==1)printf("KEY0 DOWN \n"); //只接收到了第0位
if(flag_receive==2)printf("KEY1 DOWN \n"); //只接收到了第1位
if(flag_receive==3)printf("KEY2 DOWN \n"); //只接收到了第0位,第1位
if(flag_receive==6)printf("KEY_UP DOWN \n");//只接收到了第1位,第2位,但是此处第2位被屏蔽掉了,所以永远不会执行
delay_ms(50);
//OSFlagPost(flags,0X001F,OS_FLAG_CLR,&err); //全部信号量清零,如果不清零则flags的值一直存在,也就是全部post0。也可以在pend函数中加上消耗OS_FLAG_CONSUME,即
//flag_receive=OSFlagPend(flags,0X0003,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,0,&err);//请求信号量集第0位,第1位,两位全部接收到1才可跳过
};
}
4.发送信号量集
//在key_task任务中根据不同按键值发送不同的信号位
void key_task(void *pdata)
{
u8 key=0;
u8 err=0;
while(1)
{
key=KEY_Scan(0);
switch(key)
{
case 1:
OSFlagPost(flags,1,OS_FLAG_SET,&err);//将当前的KEY值作为信号量集发送出去,然后信号量集任务中就会收到(发送第0位)
break;
case 2:
OSFlagPost(flags,2,OS_FLAG_SET,&err);//将当前的KEY值作为信号量集发送出去,然后信号量集任务中就会收到(发送第1位)
break;
case 3:
OSFlagPost(flags,3,OS_FLAG_SET,&err);//将当前的KEY值作为信号量集发送出去,然后信号量集任务中就会收到(发送第0,1位)
break;
case 4:
OSFlagPost(flags,8,OS_FLAG_SET,&err);//将当前的KEY值作为信号量集发送出去,然后信号量集任务中就会收到(发送第3位)
break;
default:break;
}
delay_ms(10);
};
}
最终的实验现象:按下KEY2,串口打印KEY2 DOWN,按下KEY0和KEY1,串口打印KEY2 DOWN。
5.查询信号量集状态(备用)
#if OS_FLAG_QUERY_EN > 0u
OS_FLAGS OSFlagQuery (OS_FLAG_GRP *pgrp, //待查询的信号量集的指针
INT8U *perr //错误信息
)
{
....................................................
}
6.删除信号量集
OS_FLAG_GRP *OSFlagDel(
OS_FLAG_GRP *pgrp,//待删除的信号量集指针
INT8U opt,INT8U *err;//错误信息
)
|