| 本帖最后由 makearm 于 2010-7-23 17:10 编辑 
 reset:
 /*stack setup for each mode*/
 /* SVC32 mode*/
 mrs r0,cpsr
 bic r0,r0,#0x1f
 orr r0,r0,#0x13    //进入svc模式
 msr cpsr,r0
 ldr r0, _TEXT_BASE
 sub r0, r0, #CFG_MALLOC_LEN   //预留空间
 sub r0, r0, #CFG_GBL_DATA_SIZE
 #ifdef CONFIG_USE_IRQ
 sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
 #endif
 sub sp, r0, #12    //再预留3word,设置堆栈
 #ifdef CONFIG_USE_IRQ     //如果使用IRQ,
 /* IRQ mode*/
 mov R4, #0xD2
 msr cpsr, R4       //进入IRQ模式,禁止IRQ和FRQ
 ldr r0, _TEXT_BASE
 sub r0, r0, #CFG_MALLOC_LEN
 sub r0, r0, #CFG_GBL_DATA_SIZE
 sub r0, r0, #(CONFIG_STACKSIZE_FIQ)
 sub sp, r0, #12    //设置IRQ堆栈
 
 /* FIQ mode*/
 mov R4, #0xD1    //设置FIQ堆栈
 msr cpsr, R4       //进入FRQ模式,禁止IRQ和FRQ
 ldr r0, _TEXT_BASE
 sub r0, r0, #CFG_MALLOC_LEN
 sub r0, r0, #CFG_GBL_DATA_SIZE
 sub sp, r0, #12
 #endif
 /* ABORT mode*/
 mov R4, #0xD7    //设置ABORT堆栈
 msr cpsr, R4       //进入ABORT模式,禁止IRQ和FRQ
 ldr r0, _TEXT_BASE
 sub r0, r0, #CFG_MALLOC_LEN
 sub r0, r0, #CFG_GBL_DATA_SIZE
 sub sp, r0, #8    //预留2word
 /* UNDEFINE mode*/
 mov R4, #0xDB    //设置UNDEFINE堆栈
 msr cpsr, R4
 ldr r0, _TEXT_BASE
 sub r0, r0, #CFG_MALLOC_LEN
 sub r0, r0, #CFG_GBL_DATA_SIZE
 sub sp, r0, #4
 /* SYSTEM mode*/
 mov R4, #0xDF    //设置SYSTEM堆栈
 msr cpsr, R4
 ldr r0, _TEXT_BASE
 sub r0, r0, #CFG_MALLOC_LEN
 sub sp, r0, #CFG_GBL_DATA_SIZE
 /*Return to SVC mode 返回SVC模式*/
 mov R4, #0xD3
 msr cpsr, R4
 
 我想问一下``这样做的目的是什么,我个人觉得没什么意思``
 启动的时候只要在set the cpu to SVC32 mode模式申请一次就可以了! 因为根本不会出现什么异常,技术有异常,这样的申请方式会不会冲突了呢? 还请高手指点!
 |