加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

OSTimeTick()函数解析

(2011-06-22 22:19:33)
标签:

杂谈

分类: uCOS_ii
void OSTimeTick (void) //这个节拍服务函数是在OSTickISR函数中调用的,目的是在时钟节拍到来时,检查每个任务的任务控制块中的.OSTCBDly-1后是否为0,如果是,那么表明这个任务刚才是挂起的状态,此时应改变为就绪态
{
   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++; //节拍计数器+1
    // OS_EXIT_CRITICAL();
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有