uCOS-II内核之时钟节拍

uCOS-II内核之时钟节拍
在uCOS-II里,时钟节拍就好比是人的心脏一样重要。它对于CPU能顺利在各任务间切换有着至关重要的作用。
uCOS-II需要用户提供时钟源。使用时钟源有一个特别需要注意的地方:用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。
Ucos II中的时钟节拍服务是通过在定时器中断服务子程序中调用OSTimeTick()实现的。
OSTimeTick()代码如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void OSTimeTick (void)  
  2. {  
  3.     OS_TCB *ptcb;  
  4.    
  5.     OSTimeTickHook();                                               //(1)  
  6.     ptcb = OSTCBList;                                               //(2)  
  7.     while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {                       //(3)  
  8.         OS_ENTER_CRITICAL();  
  9.         if (ptcb->OSTCBDly != 0) {  
  10.             if (--ptcb->OSTCBDly == 0) {  
  11.                 if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {         //(4)  
  12.                     OSRdyGrp               |= ptcb->OSTCBBitY;      //(5)  
  13.                     OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;  
  14.                 } else {  
  15.                     ptcb->OSTCBDly = 1;  
  16.                 }  
  17.             }  
  18.         }  
  19.         Ptcb = ptcb->OSTCBNext;  
  20.         OS_EXIT_CRITICAL();  
  21.     }  
  22.     OS_ENTER_CRITICAL();                                             //(6)  
  23.     OSTime++;                                                        //(7)  
  24.     OS_EXIT_CRITICAL();  
  25. }  

我们知道,CPU总是执行就绪表中优先级最高的任务,任务有没有在就绪表中就得依靠OSTimeTick()了。OSTimeTick()很大的工作是给每个用户任务控制块OS_TCB中的时间延时项OSTCBDly减1,当某任务的任务控制块中的时间延时项OSTCBDly减到了零,这个任务就进入了就绪态。
 
下面是对以上代码的分析。

OSTimtick()先调用可由用户定义的时钟节拍外连函数OSTimeTickHook(),这个外连函数可以将时钟节拍函数OSTimetick()予以扩展(1)。uCOS-II的作者决定首先调用OSTimTickHook()是打算在时钟节拍中断服务一开始就给用户一个可以做点什么的机会,因为用户可能会有一些时间要求苛刻的工作要做。OSTimtick()中量大的工作是给每个用户任务控制块OS_TCB中的时间延时项OSTCBDly减1(如果该项不为零的话)。OSTimTick()从OSTCBList开始,沿着OS_TCB链表做,一直做到空闲任务(3)。当某任务的任务控制块中的时间延时项OSTCBDly减到了0,这个任务就进入了就绪态(5)。而确切被任务挂起的函数OSTaskSuspend()挂起的任务则不会进入就绪态(4)。OSTimTick()的执行时间直接与应用程序中建立了多少个任务成正比。OSTimeTick()还通过调用OSTime  (7)累加从开机以来的时间,用的是一个无符号32位变量。注意,在给OSTime加1之前使用了关中断,因为多数微处理器给32位数加1的操作都得使用多条指令。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值