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