1. iROM启动MP Core时,通常的做法:
(1)让CPU0执行主要开机流程,其它的处理器进入WFI.
(在启动时,每个处理器可以透过CPU ID得知自己是否为CPU0,如果不是,就进入WFI的程序代码中.)
即:让AP进入Sleep
(2) 初始化外部内存与执行系统的初始化
(3) 设定 Stack
在DRAM初始化前,Stack是建立在SRAM中的。
(4) 把BootRom程序代码复制到外部内存中
(5) 重新Mapping 内存位置
(把0×00000000地址对应到外部内存 或 I-TCM如果 0×00000000地址要跑中断表的话(or 中断表对应到0xffff0000))
因为,Cold Reset时为了顺利开机,把iROM映射到了0x0000 0000处.
(6) 把第二阶段的BootLoader加载到外部内存中 or OnChip SRAM.\
(7) 执行第二阶段的BootLoader
2. 如何识别当前是哪个CPU在执行
执行时期,软件可以透过 CPU ID Register知道目前是MPCore中哪个处理器执行该程序代码,
CPU Id储存在CP15 c0中,长度为32bits,只能在特权等级(也就是SVC Mode下)被读取,读取的范例如下程序代码所示:
MRC p15,0,<Rd>,c0,c0,5; returns CPU ID register
31 12 11 … 8 7 … 4 3 … 0
SBZ Cluster ID SBZ CPU ID
说明如下,
(1) Cluster ID:
用以支持 Multi-MPCore架构下的Cluster识别之用 (The Cluster ID field value is set by the CLUSTERID configuration pins.)
(2) CPU ID: 视处理器的个数,例如四个处理器ID依序为 0×00,0×01,0×02与0×03