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
}
网友评论