平台介绍:
在这些函数调用完了之后呢,其他三个核就进入了一个可使用状态。
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)
{
}
else
CPUSET_SET (enabledCpus, cpu);
}
timeoutStart = vxAbsTicksGet ();
/*如果没有使能就等待*/
do
{
currentTickCount = vxAbsTicksGet ();
if ((currentTickCount - timeoutStart) > timeoutTicks)
{
for ( cpu = 1 ; cpu < numCpus ; cpu ++)
{
if (!CPUS