多核的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
- 多核的idleTask的设定及其功能
- 多核编程的几个难题及其应对策略
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- 使用CSDN—MarkDown编辑数学公式
- android NetWorkInfo类的isConnected()与isAvailable()两个函数
- Android中使用View实现选项卡功能
- 查看liunx版本的命令
- 《去哪网编程题》filename extension
- 多核的idleTask的设定及其功能
- AJAX的代码
- HDU-2045 不容易系列之(3)—— LELE的RPG难题(递推)
- 170
- PHP实现用户异地登录提醒
- javascript几种写空格符的方法
- 171
- 172
- 173