任務調度分爲三種:函數
(一)事件型任務調度;事件
(二)定時型任務調度;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