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没有这个选择权是错误的,因为它本身是授权的,那你说它有没有这个选择权呢?
明白了吗?
文章评论(0条评论)
登录后参与讨论