版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tiantao2012/article/details/87009030
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 是一个全局变量,用来保存当前运行task
LITE_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*/