打印

2440初始化堆栈时出现的奇怪问题

[复制链接]
1961|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AC, ST, Stack, ck, ps
;****************************************************
;初始化各种工作模式下的堆栈指针      
;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的,而在状态切换中来来去去的最终导致前后不一致呢?
期待~~~~~~~~~~~~

相关帖子

沙发
chengchenz| | 2010-7-25 22:05 | 只看该作者
ARM核Reset之后,IF位是置1的,也就是中断和快中断都是禁止的(注意,IF位置1表示禁止,清零表示允许中断)。所以,执行前就是跟你给的执行前的图是一致的。书上写的也是对的,而你的理解“实际上I,F位刚上电时也是0”是不对的,估计你理解成了“IF位置1表示允许中断”。

楼主位给的代码,最后位置是
BIC R0,R0,#MODEMASK|NOINT
ORR R1,R0,#SVCMODE
MSR cpsr_cxsf,R1  ;管理模式,SVCMode
LDR SP,=SVCStack  ;SVCStack=0x33FF_5800

其中
BIC R0,R0,#MODEMASK|NOINT  这句把R0中对应的IF位清零了
ORR R1,R0,#SVCMODE  置为SVC模式
MSR cpsr_cxsf,R1  最后这句就是真正写到cpsr中,这个时候是SVC + IF清零(也就是中断快中断允许)
跟你给的执行后的图也是一致的。

使用特权

评论回复
板凳
chengchenz| | 2010-7-25 22:11 | 只看该作者

使用特权

评论回复
地板
ADaiPlay|  楼主 | 2010-7-26 22:43 | 只看该作者
感谢楼上释疑,小弟茅塞顿开:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:老实做人,塌心做事——为理想挥汗 网站:www.edreamtek.com 文章:http://blog.csdn.net/adaiplay

23

主题

626

帖子

6

粉丝