多核的idleTask的设定及其功能

来源:互联网 发布:淘宝有好货报名条件 编辑:程序博客网 时间:2024/05/29 02:35

平台介绍:

loongson3A-4核cpu,vxWorks6.8

在多核使能后,核就自动加载了idleTask的内容,这个idleTask时什么时候设置好的呢?idleTask任务的内容是什么呢?

一,设置时机

函数调用关系

usrInit--->usrKernelInit--->kernelInit

_WRS_FUNC_NORETURN void kernelInit    (    UINT32 sanity,/* must match _KERNEL_INIT_PARAMS_VN_AND_SIZE */    _KERNEL_INIT_PARAMS *pParams/* parameters */    ){    for (i = 0; i < _WRS_CPU_CONFIGURED (); i++){char ** pVxIntStackEnd;char ** pVxIntStackBase;/*为idletask函数设置栈*/pMemPoolStart += (pParams->idleTaskExcepStkSize+ vxIdleExcepStackOverflowSize);pIdleTaskExcStkBaseTbl [i] = pMemPoolStart;pMemPoolStart += vxIdleExcepStackUnderflowSize;pMemPoolStart += taskKerExcStackSize;pIdleTaskStkBase[i] = pMemPoolStart;/*为每个cpu设置idleTask函数*/_WRS_KERNEL_CPU_GLOBAL_GET (i, idleTaskId) =    (WIND_TCB *) pMemPoolStart;pMemPoolStart += sizeof (WIND_TCB);/*按照对定的进行地址对齐*/pMemPoolStart = (char *) ROUND_UP (pMemPoolStart, alignSize);/*设置idleTask的中断栈*/pVxIntStackEnd = &_WRS_KERNEL_CPU_GLOBAL_GET (i, vxIntStackEnd);pVxIntStackBase = &_WRS_KERNEL_CPU_GLOBAL_GET (i, vxIntStackBase);*pVxIntStackEnd = pMemPoolStart;*pVxIntStackBase = pMemPoolStart + pParams->intStackSize;pMemPoolStart = *pVxIntStackBase;if (!globalNoStackFill)    bfill (*pVxIntStackEnd, (int) pParams->intStackSize, 0xee);*pVxIntStackBase -= vxIntStackUnderflowSize;*pVxIntStackEnd += vxIntStackOverflowSize;}}
到这里后,每个cpu就记录好了自己的idleTask函数

二,函数工作内容

idleTask任务原型是idleTaskEntry,这个任务主要是让cpu进入低功耗模式,只是我现在使用的mips架构的loongson3A-4核cpu没有实现低功耗功能。

_WRS_FUNC_NORETURN void idleTaskEntry (void)    {/*不允许删除idleTask任务    taskSafe ();/*死循环    FOREVER        {#ifdef _WRS_ARCH_HAS_CPU_PWR_MGMT   if (_func_cpuPwrIdleEnter != NULL)    _func_cpuPwrIdleEnter ();#endif /* _WRS_ARCH_HAS_CPU_PWR_MGMT */        }        }
看一下函数调用把:
usrRoot--->cpuPwrLightMgrInit--->cpuPwrEventHandlersSet
/*这里主要是注册低功耗的处理函数lightMgrHandlers*/STATUS cpuPwrLightMgrInit (void)    {    /* register the handlers */    if (cpuPwrEventHandlersSet (&lightMgrHandlers) != OK)        {        lightPwrMgrFailed = TRUE;        return (ERROR);        }    return (cpuPwrMgrEnable (TRUE));     }
/*低功耗的处理函数的定义,因为此平台没有实现低功耗,可以看到大部分的函数为空,也就是没有实现*/LOCAL CPU_PWR_EVENT_HANDLERS lightMgrHandlers =     {    (FUNCPTR) NULL,       /* CPU_PWR_EVENT_INT_ENTER event */    (int) NULL,            /* Interrupt performance state */    (FUNCPTR) NULL,       /* CPU_PWR_EVENT_INT_EXIT event */    0,                    /* CPU_PWR_EVENT_INT_EXIT argument */     (FUNCPTR) idleHandler, /* CPU_PWR_EVENT_IDLE_ENTER event */    cpuPwrC1State,        /* CPU_PWR_EVENT_IDLE_ENTER argument */       (FUNCPTR) NULL,       /* CPU_PWR_EVENT_IDLE_EXIT event */     (int)NULL,            /* CPU_PWR_EVENT_IDLE_EXIT argument */     (FUNCPTR) NULL,       /* CPU_PWR_EVENT_TASK_SWITCH event */    (FUNCPTR) NULL,       /* CPU_PWR_EVENT_CPU_UTIL */     (FUNCPTR) NULL,       /* CPU_PWR_EVENT_THRES_CROSS event */    (FUNCPTR) NULL,       /* CPU_PWR_EVENT_PRIORITY_CHANGE event */    };
STATUS cpuPwrEventHandlersSet     (    CPU_PWR_EVENT_HANDLERS_PTR  pEvents /* Pointer to event handlers */    ){...    _func_cpuPwrIdleEnter = idleEnter;....}

LOCAL void idleEnter (void) {    int intLvl;    if (pEventHandlers != NULL){if (pEventHandlers->idleEnterRtn != NULL)    {    if ((cpuPwrIdleEntered == FALSE) && (pCpuPwrPrimitives->idleEntStamp != NULL)){intLvl = INT_CPU_LOCK ();pCpuPwrPrimitives->idleEntStamp ();cpuPwrIdleEntered = TRUE; INT_CPU_UNLOCK (intLvl);}    pEventHandlers->idleEnterRtn (pEventHandlers->idleEnterRtnArg);       }}}

在这里调用的idleEnterRtn函数就是注册的lightMgrHandlers函数,这个函数呢对应的处理的函数为空,也就是不进行处理。
所以说,这里的idleTask函数,就是让cpu进行一个空转,没有做什么工作。





阅读全文
0 0
原创粉丝点击