我再补充下我的问题
Reset_Handler:
/*关闭全局中断 */
cpsid i
/* 关闭I Cache 、D Cache和MMU
* 采用读-修改-写的方式
*/
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
ble bss_loop
/* 进入IRQ模式 */
mrs r0, cpsr
bic r0, r0, #0x1f /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4 */
orr r0, r0, #0x12 /* r0或上0x13,表示使用SVC模式 */
msr cpsr, r0 /* 将r0 的数据写入到cpsr_c中 */
ldr sp,=0X80600000 /* 设置栈指针 */
/* 进入SYS模式 */
mrs r0, cpsr
bic r0, r0, #0x1f /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4 */
orr r0, r0, #0x1f /* r0或上0x13,表示使用SVC模式 */
msr cpsr, r0 /* 将r0 的数据写入到cpsr_c中 */
ldr sp,=0X80400000 /* 设置栈指针 */
/* 进入SVC模式 */
mrs r0, cpsr
bic r0, r0, #0x1f /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4 */
orr r0, r0, #0x13 /* r0或上0x13,表示使用SVC模式 */
msr cpsr, r0 /* 将r0 的数据写入到cpsr_c中 */
ldr sp,=0X80200000 /* 设置栈指针 */
/*打开全局中断 */
cpsie i
b main /* 跳转到main函数 */
这是复位中断函数中的代码,现在是的代码顺序是依次IRQ,SYS,SVC,此时进入哪个模式运行?那么如果讲上面的代码顺序调整为SYS,SVC,IRQ又进入哪个模式运行 |