;****************************************************
;初始化各种工作模式下的堆栈指针
;Don t use DRAM,such as stmfd,ldmfd......
;SVCstack is initialized before
;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
;****************************************************
InitStacks
MRS R0,CPSR
BIC R0,R0,#MODEMASK
ORR R1,R0,#UNDEFMODE|NOINT
MSR cpsr_cxsf,R1 ;未定义模式,UndefMode
LDR SP,=UndefStack ;UndefStack=0x33FF_5C00
ORR R1,R0,#ABORTMODE|NOINT
MSR cpsr_cxsf,R1 ;中止模式,AbortMode
LDR SP,=AbortStack ;AbortStack=0x33FF_6000
ORR R1,R0,#IRQMODE|NOINT
MSR cpsr_cxsf,R1 ;中断模式,IRQMode
LDR SP,=IRQStack ;IRQStack=0x33FF_7000
ORR R1,R0,#FIQMODE|NOINT
MSR cpsr_cxsf,R1 ;快速中断模式,FIQMode
LDR SP,=FIQStack ;FIQStack=0x33FF_8000
BIC R0,R0,#MODEMASK|NOINT
ORR R1,R0,#SVCMODE
MSR cpsr_cxsf,R1 ;管理模式,SVCMode
LDR SP,=SVCStack ;SVCStack=0x33FF_5800
;用户模式堆栈指针还没有被初始化
MOV PC,LR
;The LR register won t be valid if the current mode is not SVC mode.
在AXD中无论是软仿还是硬仿(在飞凌TE2440-2上),执行之前
CPSR状态寄存器I F中断都是关着的,执行完这段代码就开了
执行前:
执行后的:
问题超出了小弟的理解范围,似乎只能从某书上说的“复位时ARM强制将I,F置1,t置0,并将PC置0”里找点线索,是不是说实际上I,F位刚上电时也是0,只是ARM内部在执行微操作时才置一的?而其他SPSR中都是0的,而在状态切换中来来去去的最终导致前后不一致呢?
期待~~~~~~~~~~~~ |