一步步開發OS(三)任務調度

任務調度分爲三種:函數

(一)事件型任務調度;事件

(二)定時型任務調度;io

(三)輪詢型任務調度;event

優先級:事件型任務>定時器型任務>輪詢型任務;定時任務

/**
 ***************************************************************************************************
 * LKOS_TaskProcISR 中斷調用的函數
 *                  
 * \param          void
 * \return         void
 * \note           
 ***************************************************************************************************
 */
void  HMOS_TaskProcISR(void)
{
   INT8U event_task_i = 0;
    INT8U enent_prio = 255;
    INT8U tmr_prio = 255;
    INT8U tmr_task_i = 255;
   INT8U tmr_task_need_proc = 255;
    INT8U i = 0;遍歷

  TaskFuncType *pTcb = NULL;
  HM_OS_DisableInterrupts;
    
  osSysClrTimeIntFlag();
    if(Task_Ctrl.OSTCBCur->taskTmrOpenStateFlag == 1)
    {
    
    }
    else
    {
        Task_Ctrl.OSTCBCur->taskRunTimeCnt++;
    }定時器

    for(i=0; i<=Task_Ctrl.CurTaskLens; i++)   /* 遍歷任務列表                            */
  {
    pTcb = &Task_funcTab[i];                /* 取任務塊                                */           
        if(pTcb->taskMode == EVENT_MODE)        /* 判斷是否爲事件型任務                    */ 
        {
      if(pTcb->taskState == EVENT)          /* 是否有事件                              */ 
         {
        if(pTcb->prio < enent_prio)         /* 取最高優先級的事件型任務                */ 
        {
          enent_prio = pTcb->prio;
                    event_task_i = i;                 /* 記錄最高優先級的事件型任務,等待被調度   */
                }
            }
            else
            {
        continue;                           /* 繼續遍歷任務列表                        */
            }
        }
        else if(pTcb->taskMode == TMR_MODE)     /* 判斷是否爲定時型任務                    */
        {
      if(pTcb->taskSuspendTimeCnt != 0)     /* 定時時間是否到達                        */
      {
        pTcb->taskSuspendTimeCnt--;         /* 時間沒到計數減1                         */
      } 
      if(pTcb->taskSuspendTimeCnt == 0)     /* 定時時間到達                            */
      {
        if(pTcb->prio < tmr_prio)           /* 找到最高優先級的定時任務,等待被調度     */
        {
          tmr_prio = pTcb->prio;
          tmr_task_i = i;                   /* 記錄定時時間到的任務,等待被調度         */
          pTcb->taskSuspendTimeCnt = pTcb->taskSuspendTmr;
        }              
      }
      else
            {
        continue;                           /* 繼續遍歷任務列表                        */
            }
        }
    }
  if(enent_prio != 255)                     /* 調度事件型任務                          */
     {
    pTcb = &Task_funcTab[event_task_i];
    }
    else if(tmr_task_i != 255)                /* 調度定時型任務                          */
    {
        pTcb = &Task_funcTab[tmr_task_i];
    }
    else                                      /* 輪循調度                                */
    {
        if(Task_Ctrl.idleTask_cnt > Task_Ctrl.CurTaskLens)
        {
            Task_Ctrl.idleTask_cnt = 0;
        }
    pTcb = &Task_funcTab[Task_Ctrl.idleTask_cnt]; 
        Task_Ctrl.idleTask_cnt++;
    }
  pTcb->taskState = RUNNING;
    Task_Ctrl.OSTCBCur = pTcb;
  ppTaskStk =  &pTcb->pTaskStk;
    HM_OS_EnableInterrupts;
}im

相關文章
相關標籤/搜索