Euriklxt 发表于 2011-12-24 12:10:43

ucos 任务的状态疑问?求解中。。。

各位牛人,大虾:
    在此求教。
1:uCOS系统中,用户任务在系统中定义了六种状态,一种是运行状态,一种是挂起状态,还有剩下的四种是等待事件的状态。那么当一个用户任务完成后,调用延时函数OSTimeDly()时,该任务在任务就绪表中被注销就绪状态并赋予延时属性,但是其任务控制块没有被剥夺,任务状态标志OS_TASK_STAT也还是就绪状态没有被更改(这个用户任务不使用事件)。那么从任务就绪表的角度来看,这个任务不能不调度,不是就绪任务,从任务控制块的角度来讲其状态标志又指明他是一个就绪任务。这个时候任务是什么状态呢?从这角度讲,系统是不是应该再定义个延时状态?
2:为什么要给每个事件控制块构造一个任务等待表呢?前面的任务就绪表只需要一个就可以了,我观察在系统操作事件的函数中,都只对当前任务在等待任务表中操作,那么每个事件的等待任务表中应该总是至多只有一个标志位被置1。那么何必浪费内存,直接建立一个总的等待任务表,然后在事件操作函数中用任务的优先级作为参数不就好了么?
不解中,求教各位。

Euriklxt 发表于 2012-1-7 00:18:58

额。。。半个月没人回帖。。。。都这么低调嘛?

2005xxg 发表于 2012-1-10 12:10:11

我来答:
1)OSTimeDly() 会将调用此函数的任务从就绪表中摘除,并赋予延时属性,然后进行任务切换,其任务控制块会被剥夺。 虽然任务状态标志OS_TASK_STAT也还是就绪状态没有被更改,但是任务就绪表中没有这个任务,所以这个任务无法被调度。
在OSTimeTick (void)中判断延时到时候会将此任务重新放入任务就绪表中,然后在系统时钟中断退出时进行任务切换,回复原先的运行状态。

2)为什么要给每个事件控制块构造一个任务等待表呢?
因为等待一个事件,一个资源的可能是好几个任务,这个任务等待表中列出了等待此事件的所有任务,ucos会选择其中任务优先级最高的任务,将其放入任务就绪表。
比如一个事件,假设为厕所,厕所门外有员工,项目经理,总经理依次排队,由于总经理具有最高的职位(类似ucos的优先级),此时最先使用厕所的就是总经理,尽管他排在队伍的最后。

Euriklxt 发表于 2012-1-10 12:35:20

回复【2楼】2005xxg
-----------------------------------------------------------------------

继续请教楼上,这几天第二点弄懂了,第一点问题的关键在于不是任务被延时后能不能运行的问题,而是被延时后该任务处于何种状态的问题,如果说是等待状态,系统定义的等待状态只有等待事件的那几种状态,而没有等待延时的状态吧?而且此时TCB里的状态参数还是OS_STAT_RDY,这样说来不是有矛盾吗?

2005xxg 发表于 2012-1-10 13:09:28

“第一点问题的关键在于不是任务被延时后能不能运行的问题,而是被延时后该任务处于何种状态的问题”
此时,严格讲是处于等待状态,尽管TCB里的状态参数还是OS_STAT_RDY,因为任务已经不在任务就绪表中了。
读一下源代码,就知道了,不必纠结于ucos的OS_STAT_RDY。

Euriklxt 发表于 2012-1-11 13:58:38

回复【4楼】2005xxg
-----------------------------------------------------------------------
的确是这样,理论上这种情况下任务应该是属于等待状态了,为了与等待事件的状态区分,可以称之为等待延时的状态,因为两者原理是不一样的。
呵呵,最近在看2.52版的代码,一路代码读下来,缺陷还是很多的。即使是这种大牛编写的程序,多多少少也有不尽如人意的地方,难怪总是要修修补补。看来世界上本来就没有完美的东西吧,技术也是如此。不过是想把问题搞清楚,知其然也要知其所以然。谢谢楼上的指教。
页: [1]
查看完整版本: ucos 任务的状态疑问?求解中。。。