在UCOS2的FLAG中有个OS_FLAG_CONSUME,试了半天没试出来怎么用的
看了网上很多说法,都说是OSFlagPend()进入后在OS_FLAG_WAIT_SET_ALL加上|OS_FLAG_CONSUME这样就会清空标志,但我实际试出来不是这样,上代码在A任务中
OSFlagPend(ETH_NetDownF,0x0001,OS_FLAG_WAIT_CLR_ALL,0,&err);
if(err==OS_NO_ERR)
{
//其他限制条件
OSFlagPost(ETH_NetDownF,ETH_Frame_NetDownf,OS_FLAG_SET,&err);
}
B任务中
OSFlagPend(ETH_NetDownF,0x0001,OS_FLAG_WAIT_SET_ALL|OS_FLAG_CONSUME,0,&err);
if(err==OS_NO_ERR)//本意是进入后把0x0001位清零,但实际测试B任务是不会进入了,但是A任务也进入不了了,其他地方没有复位置位操作了
{
}
换了一个测试
B任务中
OSFlagPend(ETH_NetDownF,0x0001,OS_FLAG_WAIT_SET_ALL,0,&err);//这里不加OS_FLAG_CONSUME
if(err==OS_NO_ERR
{
OSFlagPost(ETH_NetDownF,0xFFFF,OS_FLAG_CLR,&err);//在B任务完成后加入这个代码,之后A任务也能进入了,当A任务的限制条件满足后就能再次执行B任务
}
麻烦哪位能讲解一下,谢谢,感觉OS_FLAG_CONSUME想一个局部变量,只在本任务中有效似的 没人知道吗 本帖最后由 derive3000 于 2013-12-17 13:28 编辑
看你的描述感觉是ucos使用OS_FLAG_CONSUME选项只是把OS_FLAG_GRP结构中的OS_FALGS Flags变量给清除了,并没有进行推送,以此防止其他任务再次被执行(例如其他的进行非阻塞等待该FLAG的任务),因为Pend函数在接收到Flag标志时并不是任务调度点。建议你试试在使用了OS_FLAG_CONSUME选项后,也要在if语句中使用:OSFlagPost(ETH_NetDownF,0xFFFF,OS_FLAG_CLR,&err);保证进行向任务A的推送动作。
这个也只是猜测,具体只要看一看它的源代码就清楚了。就看Post函数。
页:
[1]