joyko 发表于 2009-6-26 17:05:32

请问UCOSII 调用OSTaskSuspend()挂起与接受消息/信号量的问题

最近在学习UCOSII,在看到书上说的一个地方不明白,就是某任务在等待消息时,需要用OSQPend,OSSemPend之类的函数,这几个函数的作用是挂起当前任务,直到取得消息或者信号量,或者等待超时。然后书上又有讲一个被OSTaskSuspend()函数挂起的任务也可以接受消息/信号量,该任务将一直保持挂起状态,直到通过调用OSTaskResume()函数恢复任务的运行 。
    最后一句话就不知道该怎么理解了,在OSTaskSuspend()函数里没看到调用OSQPend(),OSSemPend()等函数的句子,那么如果任务在调用OSTaskSuspend()挂起后,是如何接受消息的呢?
    新手起步,希望各位大侠指点指点!

joyko 发表于 2009-6-28 18:38:10

自己顶起,没人帮忙吗,还是我说的不够明白/?

aaa1982 发表于 2009-6-30 16:34:34

OSTaskSuspend()和OSQPend,OSSemPend不是一回事。



OSTaskSuspend()挂起任务以后,如果没有OSTaskResume()任务就一直挂起了,永远不会进入就绪表。

而所有的Pend一般都有超时的指标,就算没有post操作,如果时间到了,也会使任务进入就绪表。(当然也可以无限期等待)

关于suspend的一个很通用的方法是先建立一个任务Task0,在该任务(Task0)建立所有实际需要的任务,最后Suspend task0,这样

Task0就再也不会执行了。

而在task0中建立的任务开始按照优先级轮流执行。

aaa1982 发表于 2009-6-30 16:36:33

而且所有pend 和supsend在任务控制模块中操作的变量也不一样。

joyko 发表于 2009-7-5 13:42:44

感谢AAA1982!,说的很清楚,但是我的问题好像还没解决,“一个被OSTaskSuspend()函数挂起的任务也可以接受消息/信号量”?(这句话是完整摘自一本UCOS2教程书上面的)
按我自己的理解是,一个任务要接受消息/信号量,它首先要用 PEND挂起,如果挂起之后,这个任务就要在等待时间到或者其他任务POST这个消息之后才能继续运行。问题是如果一个任务由SUSPEND挂起后,它如何接受消息?

ralfak 发表于 2009-7-6 23:01:24

4楼,你说了这么半天你自己就不会看一下源代码吗?
task.c & core.c就这两个文件

aaa1982 发表于 2009-7-16 09:23:34

joyko 你好:



你是不是这个意思

如果任务先执行OSSemPend那么在接受到信号量以前不可能执行OSTaskSuspend()?

如果先执行了OSTaskSuspend(),那么该任务肯定没有在等待信号量,也就是说肯定不会在信号量等待列表里面。

我认为这么解释比较合适


我记忆中好像OSTaskSuspend()是以优先级作为参数的(好象是),所以就可以这样,一个任务(TaskA)先OSSemPend开始等待信号量,

然后被另外一个任务OSTaskSuspend()了,但是TaskA的优先级比较高,所以下回释放信号量的时候(OSSempost),在等待信号量列表中

会先找到TaskA,虽然他已经SUSPend了,但是还是会接受到一个信号量(也就是把TASKA的任务控制模块中一个变量清零),但是由于

TaskA的任务控制模块中的suspend位还是1,所以TaskA虽然接受了信号量但是不会被放到任务就绪列表中去。

joyko 发表于 2009-7-16 23:58:04

to: aaa1982

之前疑问确实如你说的那样的,这段时间在自学ARM,然后一边看OS,打算对手上的开发板了解个大概后再上OS,书上看来的没应用真的

了解的不够啊。你这么一说我就明白了,呵呵!看书上的例子一般都是给自己挂起,也就一时忘记了OSTaskSuspend()是以优先级作为

参数,让大家见笑了^_^
页: [1]
查看完整版本: 请问UCOSII 调用OSTaskSuspend()挂起与接受消息/信号量的问题