liteos中每个task的时间片默认是10个时钟周期

版权声明:本文为博主原创文章,未经博主允许不得转载。 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*/

猜你喜欢

转载自blog.csdn.net/tiantao2012/article/details/87009030