uCOS关于OSTimeDly()不解!

[复制链接]
8632|15
 楼主| zjf0000 发表于 2007-9-21 09:36 | 显示全部楼层 |阅读模式
TI, ucos, ST, stc, tc
书上说:任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。
但是看uCOS的源码,没有发现使其进入就绪状态的代码啊!
void OSTimeDly (INT16U ticks)
 
{
 if(ticks>0) 
{                                                         
 
OS_ENTER_CRITICAL();
 
if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0)
{     
 
OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
 
}
 
OSTCBCur->OSTCBDly = ticks;                                        
 
OS_EXIT_CRITICAL();
 
        OSSched();                                                            
 
}
 
}
小弟不明,大虾请指点一下。
 
computer00 发表于 2007-9-21 09:39 | 显示全部楼层

这个只是进入延时的代码

使其恢复到就绪态必须要由其它的任务或者调度器来实现,任务自己是无法恢复自己的,因为它已经被挂起了。
ayb_ice 发表于 2007-9-21 09:39 | 显示全部楼层

你对RTOS的理解还很初级...

 楼主| zjf0000 发表于 2007-9-21 09:54 | 显示全部楼层

但是那上边不是说了吗?

书上说:任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。

难道这是错误的?
 楼主| zjf0000 发表于 2007-9-21 10:06 | 显示全部楼层

如下

是不是OSTimeDly跟VC中的Sleep()类似,指放弃当前线程的使用权,等延时到达之后重新开始执行?
computer00 发表于 2007-9-21 10:20 | 显示全部楼层

不是类似,本来就是一样的。

 楼主| zjf0000 发表于 2007-9-21 10:21 | 显示全部楼层

圈圈说的不对吧?

void OSTimeTick (void)
 
{
 
OS_TCB *ptcb; 
OSTimeTickHook();                                                       
ptcb = OSTCBList;                                                         
while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {                              
 
OS_ENTER_CRITICAL();
 
if (ptcb->OSTCBDly != 0) {
 
if (--ptcb->OSTCBDly == 0) {                  *
 
if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {      *        
 
OSRdyGrp               |= ptcb->OSTCBBitY;        *       
 
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;          *
 
} else {
 
ptcb->OSTCBDly = 1;
 
}
 
}
 
}
 
ptcb = ptcb->OSTCBNext;
 
OS_EXIT_CRITICAL();
 
}
 
OS_ENTER_CRITICAL();                                                      
 
OSTime++;                                                                  
 
OS_EXIT_CRITICAL();
 
}

有星号的那几句显示当延时到达是,任务是自动进入就绪状态的。
computer00 发表于 2007-9-21 10:47 | 显示全部楼层

这个就是时间片调度器啊,OSTimeTick,它将任务唤醒了。

跟你使用sleep睡眠,然后再由windows的时间片调度器唤醒是一样的机制。
 楼主| zjf0000 发表于 2007-9-21 10:57 | 显示全部楼层

就是啊

它不就是把每个任务的延时时间依次减1吗?等减到0的时候不就是进入就绪状态了吗?
所以一个任务调用OSTimeDly()后,一旦规定的时间期满就进入就绪状态是对的
不是像你所说的那样:使其恢复到就绪态必须要由其它的任务或者调度器来实现,任务自己是无法恢复自己的,因为它已经被挂起了。


不知道我说的对不??????????
古道热肠 发表于 2007-9-21 11:42 | 显示全部楼层

恢复到就绪状态只是具备了执行的条件

  还是要主调度程序选中此任务来执行才能执行的任务的。
computer00 发表于 2007-9-21 12:28 | 显示全部楼层

那它是如何进入就绪态的? 是任务调度器让它进入就绪态的

 楼主| zjf0000 发表于 2007-9-21 13:11 | 显示全部楼层

明白了,谢谢00,谢谢古版。

ayb_ice 发表于 2007-9-21 14:54 | 显示全部楼层

延时一般是系统中断来管理的...

hychyc2008 发表于 2015-7-3 15:51 | 显示全部楼层
任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。
这句话这样理解:OSTimeDly()里会对任务块的OSTCBDly赋值,就是这个任务的延时节拍数。这里的"一旦规定的时间期满"指的是这个OSTCBDly减为0,因为减为0后任务就是就绪的了,他说的不是OSTimeDly()函数里的延时。书上这里说的简略,使人容易误解。
OSTimeDly()函数是使任务挂起,给OSTCBDly赋值,他是不能使任务自己把自己弄成就绪的。
734774645 发表于 2015-7-3 17:00 | 显示全部楼层
切入延时代码。
冰河w 发表于 2015-7-3 20:47 | 显示全部楼层
OSTimeDly()函数是使任务挂起,给OSTCBDly赋值,他是不能使任务自己把自己弄成就绪的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

421

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部