任务优先级调度工作流程分析

1、任务优先级调度工作流程

图片.png

2、对应代码

/***********************************************************************************
函数功能: 对ready表进行调度.
入口参数: none.
返 回 值: 即将运行的任务的TCB指针.
***********************************************************************************/
TCB* taskReadyTabSched(void)
{
    TCB* preadyTcb;
    TCBQUE* pstrTaskQue;
    U8 ucTaskPrio;

    /* 获取ready表中优先级最高的任务的TCB */
    ucTaskPrio = taskGetHighestPrio(&gstrReadyTab.strFlag);
    pstrTaskQue = (TCBQUE*)dlistEmpInq(&gstrReadyTab.astrList[ucTaskPrio]);
    preadyTcb = pstrTaskQue->pstrTcb;

    return preadyTcb;
}

/***********************************************************************************
函数功能: 将任务添加到任务调度表对应的优先级标志表中.
入口参数: pstrPrioFlag: 调度表对应的优先级标志表指针.
          ucTaskPrio: 任务的优先级.
返 回 值: none.
***********************************************************************************/
void taskSetPrioFlag(PRIOFLAG* pstrPrioFlag, U8 ucTaskPrio)
{
#if PRIORITYNUM >= PRIORITY128
    U8 ucPrioFlagGrp1;//获取第一组的组号(也就是哪个byte)
    U8 ucPrioFlagGrp2;//获取第二组的组号(也就是哪个byte)
    U8 ucPosInGrp1;//确定第一组的组号中的哪一个bit
    U8 ucPosInGrp2;//确定第二组的组号中的哪一个bit
    U8 ucPosInGrp3;//确定第三组的中的哪一个bit
#elif PRIORITYNUM >= PRIORITY16
    U8 ucPrioFlagGrp1;
    U8 ucPosInGrp1;
    U8 ucPosInGrp2;
#endif

    /* 设置调度表对应的优先级标志表 */
#if PRIORITYNUM >= PRIORITY128

    /* 获取优先级标志在第一组和第二组中的组号 */
    ucPrioFlagGrp1 = ucTaskPrio / 8;
    ucPrioFlagGrp2 = ucPrioFlagGrp1 / 8;

    /* 获取优先级标志在每一组中的位置 */
    ucPosInGrp1 = ucTaskPrio % 8;
    ucPosInGrp2 = ucPrioFlagGrp1 % 8;
    ucPosInGrp3 = ucPrioFlagGrp2; //第三组bit位就是第二组组号

    /* 在每一组中设置优先级标志, */
    pstrPrioFlag->aucPrioFlagGrp1[ucPrioFlagGrp1] |= (U8)(1 << ucPosInGrp1);
    pstrPrioFlag->aucPrioFlagGrp2[ucPrioFlagGrp2] |= (U8)(1 << ucPosInGrp2);
    pstrPrioFlag->ucPrioFlagGrp3 |= (U8)(1 << ucPosInGrp3);

#elif PRIORITYNUM >= PRIORITY16

    ucPrioFlagGrp1 = ucTaskPrio / 8;

    ucPosInGrp1 = ucTaskPrio % 8;
    ucPosInGrp2 = ucPrioFlagGrp1;

    pstrPrioFlag->aucPrioFlagGrp1[ucPrioFlagGrp1] |= (U8)(1 << ucPosInGrp1);
    pstrPrioFlag->ucPrioFlagGrp2 |= (U8)(1 << ucPosInGrp2);

#else

    pstrPrioFlag->ucPrioFlagGrp1 |= (U8)(1 << ucTaskPrio);

#endif
}


/***********************************************************************************
函数功能: 获取任务调度表中任务的最高优先级.
入口参数: pstrPrioFlag: 调度表的优先级标志表指针.
返 回 值: 任务调度表中的最高优先级.
***********************************************************************************/
U8 taskGetHighestPrio(PRIOFLAG* pstrPrioFlag)
{
#if PRIORITYNUM >= PRIORITY128
    U8 ucPrioFlagGrp1;
    U8 ucPrioFlagGrp2;
    U8 ucHighestFlagInGrp1;
#elif PRIORITYNUM >= PRIORITY16
    U8 ucPrioFlagGrp1;
    U8 ucHighestFlagInGrp1;
#endif

    /* 获取任务调度表中的最高优先级 */
#if PRIORITYNUM >= PRIORITY128

    ucPrioFlagGrp2 = caucTaskPrioUnmapTab[pstrPrioFlag->ucPrioFlagGrp3];

    ucPrioFlagGrp1 =
                caucTaskPrioUnmapTab[pstrPrioFlag->aucPrioFlagGrp2[ucPrioFlagGrp2]];

    ucHighestFlagInGrp1 = caucTaskPrioUnmapTab[pstrPrioFlag->aucPrioFlagGrp1
                                             [ucPrioFlagGrp2 * 8 + ucPrioFlagGrp1]];

    return (U8)((ucPrioFlagGrp2 * 8 + ucPrioFlagGrp1) * 8 + ucHighestFlagInGrp1);

#elif PRIORITYNUM >= PRIORITY16

    ucPrioFlagGrp1 = caucTaskPrioUnmapTab[pstrPrioFlag->ucPrioFlagGrp2];

    ucHighestFlagInGrp1 =
                caucTaskPrioUnmapTab[pstrPrioFlag->aucPrioFlagGrp1[ucPrioFlagGrp1]];

    return (U8)(ucPrioFlagGrp1 * 8 + ucHighestFlagInGrp1);

#else

    return caucTaskPrioUnmapTab[pstrPrioFlag->ucPrioFlagGrp1];

#endif
}

你可能感兴趣的:(任务优先级调度工作流程分析)