start:
ldr pc, =Reset_Handler /* 复位中断服务函数 */
ldr pc, =Undefined_Handler /* 未定义指令中断服务函数 */
ldr pc, =SVC_Handler /* SVC */
ldr pc, =PreAbort_Handler /* 预取终止 */
ldr pc, =DataAbort_Handler /* 数据终止 */
ldr pc, =NotUsed_Handler /* 未使用 */
ldr pc, =IRQ_Handler /* IRQ中断 */
ldr pc, =FIQ_Handler /* FIQ中断 */
/* 复位中断服务函数 */
Reset_Handler:
cpsid i /* 关闭IRQ */
/* 关闭I,D Cache和MMU
* 修改SCTLR寄存器,采用读-改-写的方式
*/
MRC p15, 0, r0, c1, c0, 0 /* 读取SCTLR寄存器的数据到R0寄存器里面 */
bic r0, r0, #(1 << 12) /* 关闭I Cache */
bic r0, r0, #(1 << 11) /* 关闭分之预测 */
bic r0, r0, #(1 << 2) /* 关闭D Cache*/
bic r0, r0, #(1 << 1) /* 关闭对齐 */
bic r0, r0, #(1 << 0) /* 关闭MMU */
MCR p15, 0, r0, c1, c0, 0 /* 将R0寄存器里面的数据写入到SCTLR里面 */
/* 设置中断向量偏移 */
ldr r0, =0x87800000
dsb
isb
MCR p15,0,r0,c12,c0,0 /* 设置VBAR寄存器=0x87800000 */
dsb
isb
/* 清除BSS段 */
ldr r0, _bss_start
ldr r1, _bss_end
mov r2, #0
bss_loop:
stmia r0! , {r2}
cmp r0, r1 /* 比较R0和R1里面的值 */
ble bss_loop /* 如果r0地址小于等于r1,继续清除bss段 */
/* 设置处理器进入IRQ模式 */
mrs r0,cpsr /* 读取cpsr到r0 */
bic r0,r0,#0x1f /* 清除cpsr的bit4-0 */
orr r0,r0,#0x12 /* 使用IRQ模式 */
msr cpsr,r0 /* 将r0写入到cpsr */
ldr sp, =0x80600000 /* 设置IRQ模式下的sp */
/* 设置处理器进入SYS模式 */
mrs r0,cpsr /* 读取cpsr到r0 */
bic r0,r0,#0x1f /* 清除cpsr的bit4-0 */
orr r0,r0,#0x1f /* 使用SYS模式 */
msr cpsr,r0 /* 将r0写入到cpsr */
ldr sp, =0x80400000 /* 设置SYS模式下的sp */
/* 设置处理器进入SVC模式 */
mrs r0,cpsr /* 读取cpsr到r0 */
bic r0,r0,#0x1f /* 清除cpsr的bit4-0 */
orr r0,r0,#0x13 /* 使用SVC模式 */
msr cpsr,r0 /* 将r0写入到cpsr */
ldr sp, =0x80200000 /* 设置SVC模式下的sp */
cpsie i /* 打开IRQ */
b main /* 跳转到C语言main函数 */
其中查看手册:2000 - ARM Architecture Reference Manual ARMv7-A and ARMv
Cortex-A7 MPCore Technical Reference Manual
查找CIC控制器及CP15协处理器。
MRC: 将 CP15 协处理器中的寄存器数据读到 ARM 寄存器中。
MRC 就是读 CP15 寄存器, MCR 就是写 CP15 寄存器, MCR 指令格式如下:
MCR{cond} p15, <opc1>, <Rt>, <CRn>, <CRm>, <opc2>
MRC p15, 0, r0, c0,c0,0
其中make过程遇到 # BIC指令,该指令在BIC指令集中为与( | )意思
后续make完成烧录无问题