Xilinx SDK BSP中对CPU_ID的使用

来源:互联网 发布:mysql in和exists 编辑:程序博客网 时间:2024/05/14 03:53

创建Xilinx SDK BSP时,要指定在哪个core上运行,这个选项对源码的影响如下:


xparameters.h里面的宏定义不同:

/* Definition for CPU ID */
#define XPAR_CPU_ID 1

xscugic_hw.c里面

int XScuGic_DeviceInitialize(u32 DeviceId){XScuGic_Config *Config;u8 Cpu_Id = XPAR_CPU_ID + 1;Config = &XScuGic_ConfigTable[(u32 )DeviceId];DistInit(Config, Cpu_Id);CPUInit(Config);return XST_SUCCESS;}

xscugic.c里面

int  XScuGic_CfgInitialize(XScuGic *InstancePtr,XScuGic_Config *ConfigPtr,u32 EffectiveAddr){u32 Int_Id;u8 Cpu_Id = XPAR_CPU_ID + 1;Xil_AssertNonvoid(InstancePtr != NULL);Xil_AssertNonvoid(ConfigPtr != NULL);/*  * Set some default values */InstancePtr->Config->CpuBaseAddress = EffectiveAddr;InstancePtr->IsReady = 0;InstancePtr->Config = ConfigPtr;for (Int_Id = 0; Int_Id<XSCUGIC_MAX_NUM_INTR_INPUTS;Int_Id++) {/* * Initalize the handler to point to a stub to handle an * interrupt which has not been connected to a handler. Only * initialize it if the handler is 0 which means it was not * initialized statically by the tools/user. Set the callback * reference to this instance so that unhandled interrupts * can be tracked. */if ((InstancePtr->Config->HandlerTable[Int_Id].Handler == 0)) {InstancePtr->Config->HandlerTable[Int_Id].Handler =StubHandler;}InstancePtr->Config->HandlerTable[Int_Id].CallBackRef =InstancePtr;}DistInit(InstancePtr, Cpu_Id);CPUInit(InstancePtr);InstancePtr->IsReady = XIL_COMPONENT_IS_READY;return XST_SUCCESS;}

boot.S里面

/* this initializes the various processor modes */_prestart:_boot:#if XPAR_CPU_ID==0/* only allow cpu0 through */mrcp15,0,r1,c0,c0,5andr1, r1, #0xfcmpr1, #0beqOKToRunEndlessLoop0:wfebEndlessLoop0#elif XPAR_CPU_ID==1/* only allow cpu1 through */mrcp15,0,r1,c0,c0,5andr1, r1, #0xfcmpr1, #1beqOKToRunEndlessLoop1:wfebEndlessLoop1#endifOKToRun:mrc     p15, 0, r0, c0, c0, 0/* Get the revision */and     r5, r0, #0x00f00000 and     r6, r0, #0x0000000forr     r6, r6, r5, lsr #20-4
从上面的汇编来看,如果实际加测到的CPU_ID和配置的CPU_ID如果不同,BSP将无法启动。

原创粉丝点击