任务调度分为三种:
(一)事件型任务调度;
(二)定时型任务调度;
(三)轮询型任务调度;
优先级:事件型任务>定时器型任务>轮询型任务;
/**
*************************************************************************************************** * 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; }