转载地址:http://blog.youkuaiyun.com/silent123go/article/details/53182924
1、源码及注释
cpu_init_crit标号对应的源码:
/***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***
*
* CPU_init_ critical registers
*
* setup important registers
* setup memory timing
*
***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** *** /
ENTRY(cpu_init_ crit)
/*
* Jump to board specific initialization...
* The Mask ROM will have already initialized
* basic memory. Go here to bump up clock rate and handle
* wake up conditions.
*/
b lowlevel_init @ go setup pll,mux,memory
ENDPROC(cpu_init_ crit)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
lowlevel_init标号对应的源码:(这个代码要初始化内存等,是和具体平台有关的,所以应该去对应平台的目录下找lowlevel_init.S文件)
ENTRY(lowlevel_init)
ldr sp, =CONFIG_SYS_INIT_SP_ADDR
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
#ifdef CONFIG_SPL_BUILD
ldr r9 , =gdata
#else
sub sp, sp, #GD_SIZE
bic sp, sp, #7
mov r9 , sp
#endif
push {ip, lr}
bl s_init
pop {ip, pc}
ENDPROC(lowlevel_init)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
2、相关指令介绍
ldr ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。 (1)LDR r0,=name,像这种带等号的是伪指令,而不是ARM指令,LDR 伪指令用于加载立即数或一个地址值到指定寄存器。 如果name是立即数的话:LDR R0,=0X123;//将0X123存入R0 如果name是个标识符:LDR R0,=NAME;//将NAME的地址存入R0 相当于: LDR R0,LABEL; LABEL DCB NAME;//分配内存并用NAME初始化(LABEL为内存的起始地址?) (2)LDR R1,[R0] ;如果没有等号,LDR 指令用于从内存中读取数据放入寄存器中.该指令是 将R0 地址处的数据读出,保存到R1 中(零偏移)。
3、代码流程走读
1、lowlevel_init CONFIG_SYS_INIT_SP_ADDR该宏定义在文件include/configs/mx6slevk.h文件中(因为我自己用的CPU是飞思卡尔的MX6SL)
#define CONFIG_SYS_INIT_SP_ADDR \
(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
#define CONFIG_SYS_INIT_RAM_ADDR IRAM_BASE_ADDR
#define CONFIG_SYS_INIT_SP_OFFSET \
(CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
#define IRAM_BASE_ADDR 0x00900000
#define CONFIG_SYS_INIT_RAM_SIZE IRAM_SIZE
#define GENERATED_GBL_DATA_SIZE 176 /* (sizeof(struct global_data) + 15) & ~15 @ */
#define IRAM_SIZE 0x00040000
根据以上定义,计算得CONFIG_SYS_INIT_SP_ADDR = 0x00900000 + 0x00040000 - 176。查看该cpu的内存分布可知,0x00900000处是该cpu的片上内存(on chip ram),大小有256K。所以在进入s_init函数之前,SP指针如下图所示: