打印

uCOS关于OSTimeDly()不解!

[复制链接]
7463|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()取消了延时,它就会马上进入就绪状态。

难道这是错误的?

使用特权

评论回复
5
zjf0000|  楼主 | 2007-9-21 10:06 | 只看该作者

如下

是不是OSTimeDly跟VC中的Sleep()类似,指放弃当前线程的使用权,等延时到达之后重新开始执行?

使用特权

评论回复
6
computer00| | 2007-9-21 10:20 | 只看该作者

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

使用特权

评论回复
7
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();
 
}

有星号的那几句显示当延时到达是,任务是自动进入就绪状态的。

使用特权

评论回复
8
computer00| | 2007-9-21 10:47 | 只看该作者

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

跟你使用sleep睡眠,然后再由windows的时间片调度器唤醒是一样的机制。

使用特权

评论回复
9
zjf0000|  楼主 | 2007-9-21 10:57 | 只看该作者

就是啊

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


不知道我说的对不??????????

使用特权

评论回复
10
古道热肠| | 2007-9-21 11:42 | 只看该作者

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

  还是要主调度程序选中此任务来执行才能执行的任务的。

使用特权

评论回复
11
computer00| | 2007-9-21 12:28 | 只看该作者

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

使用特权

评论回复
12
zjf0000|  楼主 | 2007-9-21 13:11 | 只看该作者

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

使用特权

评论回复
13
ayb_ice| | 2007-9-21 14:54 | 只看该作者

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

使用特权

评论回复
14
hychyc2008| | 2015-7-3 15:51 | 只看该作者
任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。
这句话这样理解:OSTimeDly()里会对任务块的OSTCBDly赋值,就是这个任务的延时节拍数。这里的"一旦规定的时间期满"指的是这个OSTCBDly减为0,因为减为0后任务就是就绪的了,他说的不是OSTimeDly()函数里的延时。书上这里说的简略,使人容易误解。
OSTimeDly()函数是使任务挂起,给OSTCBDly赋值,他是不能使任务自己把自己弄成就绪的。

使用特权

评论回复
15
734774645| | 2015-7-3 17:00 | 只看该作者
切入延时代码。

使用特权

评论回复
16
冰河w| | 2015-7-3 20:47 | 只看该作者
OSTimeDly()函数是使任务挂起,给OSTCBDly赋值,他是不能使任务自己把自己弄成就绪的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

421

帖子

1

粉丝