美文网首页
任务优先级调度工作流程分析

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

作者: yuanyuanxingliu | 来源:发表于2017-05-31 23:35 被阅读0次

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
}

相关文章

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

    1、任务优先级调度工作流程 2、对应代码

  • 从处理机调度

    优先级反转:在基于优先级的可抢占的调度机制中,系统强制使高优先级任务等待低优先级任务。

  • Okhttp主流程源码浅析(2)

    上一篇Okhttp主流程源码浅析(1)分析到任务调度方面,接着把剩下的主流程分析. 当一个任务被执行起来,会调用g...

  • 调度队列的优先堆实现

    应用场景模拟 考虑优先堆的一种应用场景——按优先级的任务调度队列:每个任务有一个优先级和唯一标号,该调度队列需要具...

  • react17源码解读-设计理念

    react架构主要分为两个阶段 render 阶段包括调度和协调调度器 scheduler:调度任务的优先级,高优...

  • UCOSIII_多任务创建(二)

    任务调度和切换就是让就绪表中优先级最高的任务获得CPU使用权,UCOSIII是抢占式的,高优先级任务可以抢了低优先...

  • Spark任务调度流程

    1.启动Spark集群 2.执行jar包 3.启动了Driver进程(通过执行代码启动了Driver) 然后生成了...

  • Linux 系统之crontab命令

    Linux下的任务调度分为两类,系统任务调度 和 用户任务调度。 系统任务调度:系统周期性所要执行的工作,比如写缓...

  • 任务调度-源码分析

    TaskSchedulerImpl.submitTasks 调度器初始化 FIFOSchedulableBuild...

  • Pod调度(指定节点、污点、亲和性)

    创建一个Pod的工作流程 相关概念 工作流程图 Pod中影响调度的主要属性 资源调度依据 调度策略 资源限制对Po...

网友评论

      本文标题:任务优先级调度工作流程分析

      本文链接:https://www.haomeiwen.com/subject/mkhsfxtx.html