uCos ii系统的 时间tick函数


在实时系统中每个delay的任务依靠时间tick函数来减少TCB中delay项的值,当其减到0时,进入就绪态
任务调度的时候就会考虑就绪态的任务,所以tick函数应该算所操作系统的核心函数

点击(此处)折叠或打开

  1. /*
  2. *********************************************************************************************************
  3. * PROCESS SYSTEM TICK
  4. *
  5. * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
  6. * as a 'clock tick'). This function should be called by the ticker ISR but, can also be
  7. * called by a high priority task.
  8. *
  9. * Arguments : none
  10. *
  11. * Returns : none
  12. *********************************************************************************************************
  13. */

  14. void OSTimeTick (void)
  15. {
  16.     OS_TCB *ptcb;
  17. #if OS_TICK_STEP_EN > 0
  18.     BOOLEAN step;
  19. #endif
  20. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
  21.     OS_CPU_SR cpu_sr = 0;
  22. #endif



  23. #if OS_TIME_TICK_HOOK_EN > 0
  24.     OSTimeTickHook(); /* Call user definable hook */
  25. #endif
  26. #if OS_TIME_GET_SET_EN > 0
  27.     OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
  28.     OSTime++;
  29.     OS_EXIT_CRITICAL();
  30. #endif
  31.     if (OSRunning == OS_TRUE) {
  32. #if OS_TICK_STEP_EN > 0
  33.         switch (OSTickStepState) { /* Determine whether we need to process a tick */
  34.             case OS_TICK_STEP_DIS: /* Yes, stepping is disabled */
  35.                  step = OS_TRUE;
  36.                  break;

  37.             case OS_TICK_STEP_WAIT: /* No, waiting for uC/OS-View to set ... */
  38.                  step = OS_FALSE; /* .. OSTickStepState to OS_TICK_STEP_ONCE */
  39.                  break;

  40.             case OS_TICK_STEP_ONCE: /* Yes, process tick once and wait for next ... */
  41.                  step = OS_TRUE; /* ... step command from uC/OS-View */
  42.                  OSTickStepState = OS_TICK_STEP_WAIT;
  43.                  break;

  44.             default: /* Invalid case, correct situation */
  45.                  step = OS_TRUE;
  46.                  OSTickStepState = OS_TICK_STEP_DIS;
  47.                  break;
  48.         }
  49.         if (step == OS_FALSE) { /* Return if waiting for step command */
  50.             return;
  51.         }
  52. #endif
  53.         ptcb = OSTCBList; /* Point at first TCB in TCB list */
  54.         while (ptcb->OSTCBPrio != OS_TASK_IDLE_PRIO) { /* Go through all TCBs in TCB list */
  55.             OS_ENTER_CRITICAL();
  56.             if (ptcb->OSTCBDly != 0) { /* No, Delayed or waiting for event with TO */
  57.                 if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
  58.                                                            /* Check for timeout */
  59.                     if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
  60.                         ptcb->OSTCBStat &= ~OS_STAT_PEND_ANY; /* Yes, Clear status flag */
  61.                         ptcb->OSTCBPendTO = OS_TRUE; /* Indicate PEND timeout */
  62.                     } else {
  63.                         ptcb->OSTCBPendTO = OS_FALSE;
  64.                     }

  65.                     if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended?*/
  66.                         OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make ready */
  67.                         OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
  68.                     }
  69.                 }
  70.             }
  71.             ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
  72.             OS_EXIT_CRITICAL();
  73.         }
  74.     }
  75. }

如其题目所介绍的,它应当是时钟tick中断调用的函数,每当调用这个函数都会把OSTCBList中的所有任务遍历一遍,进行delay--的操作
第一步,调用用户自己定义的hook函数,用户可以在每个时间片中间加入自己的操作
第二步,关中断,给OSTime++,OSTime是当开启TIME_GET_SET_EN时的系统以时间片为单位的计时,开中断
第三步,标志位OSRuning如果为true,那么判断是否是step模式的tick,step有三种状态,disabile,wait和once,在wait下直接return函数,不进行tick原本应当进行的代码,如果once执行一次就置为wait,如果disable那么相当于不进行wait,直接执行tick遍历OSTCBList。
第四步,只要prio不是idleprio,那么判断delay是否为0,
是不是在等待某种信号,OS_STAT_PEND_ANY,如果是,因为等待超时,所以不再等待某种信号, 清除标志位。
第五步,如果OS_STAT_SUSPEND位为0,那么将任务在就绪表中的位置置1
第六步,将指向TCB的指针指向下一个数据块ptcb = ptcb->OSTCBNext;开始下一轮while循环
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值