本文主要是介绍多核初始化过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
平台介绍:loongson3A-4核cpu(mips架构),vxWorks6.8
多核cpu启动时,刚开始时是cpu0在运行,后面才会初始化其他三个核,这里就说一些其他三个核的初始化过程。
函数调用关系:
usrRoot-->usrSmpInit-->usrEnableCpu-->kernelCpuEnableInternal-->vxCpuStateInit
kernelCpuEnableInternal-->sysCpuEnable-->sysCpuStart-->godson3_cpu_start-->sysCpuInit-->kernelCpuEntry-->idleTask
在这些函数调用完了之后呢,其他三个核就进入了一个可使用状态。
现在呢咱们一步一步分析一下这个初始化的过程:
void usrSmpInit (void){
/*这里挂接cpu调度的中断函数,并使能。主要用于核间通信*/if ((vxIpiConnect (IPI_INTR_ID_SCHED,(IPI_HANDLER_FUNC) windRescheduleNotify,NULL) == ERROR) ||vxIpiEnable (IPI_INTR_ID_SCHED) == ERROR)){return;}
/*使能cpu*/usrEnableCpu();}
LOCAL void usrEnableCpu (void){UINT cpu;UINT numCpus = vxCpuConfiguredGet (); /*获取配置的cpu的个数*/cpuset_t enabledCpus;ULONG timeoutTicks, timeoutStart, currentTickCount;CPUSET_ZERO (enabledCpus);
/*cpu0已经run起来了,先记录cpu0*/ CPUSET_SET (enabledCpus, 0); /*设置超时时间*/vxCpuEnableTimeout = VX_ENABLE_CPU_TIMEOUT;timeoutTicks = vxCpuEnableTimeout * sysClkRateGet ();
/*对多核cpu进行使能*/for (cpu = 1; cpu < numCpus; cpu++){if (kernelCpuEnableInternal (cpu) == ERROR){}elseCPUSET_SET (enabledCpus, cpu);}timeoutStart = vxAbsTicksGet ();
/*如果没有使能就等待*/ do{currentTickCount = vxAbsTicksGet ();if ((currentTickCount - timeoutStart) > timeoutTicks){for ( cpu = 1 ; cpu < numCpus ; cpu ++){if (!CPUS
这篇关于多核初始化过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!