请问UCOSII 调用OSTaskSuspend()挂起与接受消息/信号量的问题
最近在学习UCOSII,在看到书上说的一个地方不明白,就是某任务在等待消息时,需要用OSQPend,OSSemPend之类的函数,这几个函数的作用是挂起当前任务,直到取得消息或者信号量,或者等待超时。然后书上又有讲一个被OSTaskSuspend()函数挂起的任务也可以接受消息/信号量,该任务将一直保持挂起状态,直到通过调用OSTaskResume()函数恢复任务的运行 。最后一句话就不知道该怎么理解了,在OSTaskSuspend()函数里没看到调用OSQPend(),OSSemPend()等函数的句子,那么如果任务在调用OSTaskSuspend()挂起后,是如何接受消息的呢?
新手起步,希望各位大侠指点指点! 自己顶起,没人帮忙吗,还是我说的不够明白/? OSTaskSuspend()和OSQPend,OSSemPend不是一回事。
OSTaskSuspend()挂起任务以后,如果没有OSTaskResume()任务就一直挂起了,永远不会进入就绪表。
而所有的Pend一般都有超时的指标,就算没有post操作,如果时间到了,也会使任务进入就绪表。(当然也可以无限期等待)
关于suspend的一个很通用的方法是先建立一个任务Task0,在该任务(Task0)建立所有实际需要的任务,最后Suspend task0,这样
Task0就再也不会执行了。
而在task0中建立的任务开始按照优先级轮流执行。 而且所有pend 和supsend在任务控制模块中操作的变量也不一样。 感谢AAA1982!,说的很清楚,但是我的问题好像还没解决,“一个被OSTaskSuspend()函数挂起的任务也可以接受消息/信号量”?(这句话是完整摘自一本UCOS2教程书上面的)
按我自己的理解是,一个任务要接受消息/信号量,它首先要用 PEND挂起,如果挂起之后,这个任务就要在等待时间到或者其他任务POST这个消息之后才能继续运行。问题是如果一个任务由SUSPEND挂起后,它如何接受消息? 4楼,你说了这么半天你自己就不会看一下源代码吗?
task.c & core.c就这两个文件 joyko 你好:
你是不是这个意思
如果任务先执行OSSemPend那么在接受到信号量以前不可能执行OSTaskSuspend()?
如果先执行了OSTaskSuspend(),那么该任务肯定没有在等待信号量,也就是说肯定不会在信号量等待列表里面。
我认为这么解释比较合适
我记忆中好像OSTaskSuspend()是以优先级作为参数的(好象是),所以就可以这样,一个任务(TaskA)先OSSemPend开始等待信号量,
然后被另外一个任务OSTaskSuspend()了,但是TaskA的优先级比较高,所以下回释放信号量的时候(OSSempost),在等待信号量列表中
会先找到TaskA,虽然他已经SUSPend了,但是还是会接受到一个信号量(也就是把TASKA的任务控制模块中一个变量清零),但是由于
TaskA的任务控制模块中的suspend位还是1,所以TaskA虽然接受了信号量但是不会被放到任务就绪列表中去。 to: aaa1982
之前疑问确实如你说的那样的,这段时间在自学ARM,然后一边看OS,打算对手上的开发板了解个大概后再上OS,书上看来的没应用真的
了解的不够啊。你这么一说我就明白了,呵呵!看书上的例子一般都是给自己挂起,也就一时忘记了OSTaskSuspend()是以优先级作为
参数,让大家见笑了^_^
页:
[1]