本帖最后由 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模式申请一次就可以了! 因为根本不会出现什么异常,技术有异常,这样的申请方式会不会冲突了呢? 还请高手指点! |