原创 OSFlagPost和OSFlagPend之间区别

2010-7-6 10:37 6133 6 6 分类: MCU/ 嵌入式

OSFlagPend是等待系统事件的发生。 
OSFlagPost是发事件消息给等待等待的事件。
 
这个是两个函数的基本区别.
但是我想知道的是:任务A调用OSFlagPend,发现所需要的事件标志都已经满足,如果此时consume为TRUE,则任务A把自己所等待的事件标志清零或置位,然后继续执行。说明任务A所要等待的任务都已经发生了,可以继续执行,并在继续执行前有把自己所等待的事件标志位清零或置位(让这些状态位恢复初始条件)的选择权,可以让等待事件组中(OS_FLAG_GRP)这些事件标志无效。 
   如果任务A调用OSFlagPend后,发现自己所需要的事件标志不满足,则A继续等待下去。.....这时,另一任务B开始执行(假设B执行的过程中可以发出某个事件标志,而这个事件标志正是任务A所等待的),执行了一段时间后调用OSFlagPost,OSFlagPost检察事件标志等待列表,发现任务A正在等待这个标志,则让A进入就绪状态。但是,此时就没有把自己所等待的事件标志位清零或置位(让这些状态位恢复初始条件)的选择权,即当A再次执行后,等待事件组(OS_FLAG_GRP)中这些事件标志仍然有效。 
   也就是说,任务A分别经过上述两个函数的调用都可能再次进入执行时,但等待事件组(OS_FLAG_GRP)中这些事件标志却可能具有不同的值。 

对这种区别能不能解释一下,为什么都是进入就绪态,为什么OSFlagPost有清空事件标志的选择权,而OSFlagPend却没有.


 


我想你有这个问题是因为你还没有把UCOS的标志文件的代码完全看明白吧。首先纠正你问题的错误,是OSFlagPend有清空或者是置位事件标志的选择权,而OSFlagPost没有,不要搞错了!
考虑两种情况:
你所说的这个选择权有两个。如下:
1、OSFlagPend在调用OSFlagPost之前调用,那么在OSFlagPost调用之前它是没有这个选择权的,但是不代表它没有这个选择权,因为它这个选择权在调用OSFlagPost之后获得。
2、OSFlagPend在调用OSFlagPost之后调用,那么它有这个选择权,原因是OSFlagPost已经调用完了,让它有这个权力。
那么总结一点就是,使得OSFlagPend有这个选择权都是由OSFlagPost授权。
那么你所以说的OSFlagPost没有这个选择权是错误的,因为它本身是授权的,那你说它有没有这个选择权呢?
明白了吗?

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条