本文共 1215 字,大约阅读时间需要 4 分钟。
liteos中的task是基于时间片的,每个task默认只能运行10个时间中断的时间。LITE_OS_SEC_TEXT_INIT VOID osTimesliceInit(VOID){ g_stTaskTimeSlice.pstTask = (LOS_TASK_CB *)NULL; g_stTaskTimeSlice.usTout = LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT;}其中#ifndef LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 10#endif可见每个task 默认的时间片就是10个时钟周期的中断在每个时间中断中都会调用osTimesliceCheck来检查当前task的时间片是否已经用完例如下面的g_stTaskTimeSlice 是一个全局变量,用来保存当前运行taskLITE_OS_SEC_TEXT VOID osTimesliceCheck(VOID){#给g_stTaskTimeSlice赋值后,g_stTaskTimeSlice就会记录这个task已经运行的时间片 if (g_stTaskTimeSlice.pstTask != g_stLosTask.pstRunTask) { g_stTaskTimeSlice.pstTask = g_stLosTask.pstRunTask;#从这里看到这个task默认运行的时间片是10个时钟周期中断 g_stTaskTimeSlice.usTime = (UINT16)g_ullTickCount + g_stTaskTimeSlice.usTout - 1; }#当前面的if不成立时,就会判断已经运行的时间,其中g_ullTickCount在时钟周期的中断中会自加,当g_ullTickCount再过10个时钟周期后就会等于g_stTaskTimeSlice.usTime。在#前面的if中已经赋值 if (g_stTaskTimeSlice.usTime == (UINT16)g_ullTickCount) {#可见如果已经过了10个时钟周期中断,则通过LOS_TaskYield来强制让当前task放弃cpu g_stTaskTimeSlice.pstTask = (LOS_TASK_CB *)NULL; if (LOS_TaskYield() != LOS_OK) { PRINT_INFO("%s, %d\n", __FUNCTION__, __LINE__); } } /*lint !e548*/
转载地址:http://fvnmi.baihongyu.com/