微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > ARM启动代码中的复位代码SWi软中断调用问题讨论

ARM启动代码中的复位代码SWi软中断调用问题讨论

时间:10-02 整理:3721RD 点击:

各位好,最近不经意发现一个小问题,拿出来跟大家一起探讨一下。
ARM启动代码中有一段复位代码我把贴出来:
--------------------------------------------------------------------------------------
Reset_Handler:
BL RemapSRAM //进行存储器映射的操作
#下面几行代码用来判断当前的工作模式,如果是用户模式则切换到系统模式
MRS R0, CPSR //读CPSR 到寄存器R0
AND R0, R0, #0x1F //R0 = R0 AND 0x1F
CMP R0, #Mode_USR
SWIEQ #11
BL InitStack //进行堆栈初始化工作
B __main
--------------------------------------------------------------------------------------
大家可以看到调用软中断的指令是在堆栈初始化之前,而在软中断代码段中会有STMFD sp!, {r0-r3, r12, lr}和LDMFD sp!, {r0-r3, r12, pc}^等堆栈操作,那么问题是,既然还没有初始化堆栈,那软中断中的压栈出栈操作是如何执行的,SP指的是哪?
欢迎大家讨论。

将#11号中断的代码贴上来看下

我分析:
这个软中断应该是保存复位时的用户环境用的,所以才使用了有条件软中断
CMP R0, #Mode_USR
SWIEQ #11
如果在用户模式才调用中断,所以要让这个软中断得以执行,必须是从用户模式的代码中跳到复位向量直接运行复位代码,并不能由硬件复位(上电、看门狗等)后执行
所以、如果此软中断被执行,堆栈就是已经经过程序代码初始化过的,而不是未初始化的堆栈
此软中断是一个调试手段

明白了。谢谢你。woodmice

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top