我目前正在使用Cortex-M3,并且无法理解xPSR的使用。我不确定为什么ISR号码存储在最低8位。
在线资料和数据表没有说明为何必须将数字存储在xPSR中。在ARM7-TDMI上,当前模式(FIQ,IRQ,SVC,USR,ABT,UND)存储在CPSR的最低8位。我假设它存储在那里,所以当引发异常并切换模式时,处理器知道哪个寄存器组保存CPSR的状态。但是,当需要为ISR提供服务时,Cortex-M3没有存储寄存器,并且xPSR被保存到堆栈中。
任何人都可以启发我吗?
答案 0 :(得分:1)
嗯,我不完全确定我理解这个问题 - 你问“为什么会有所不同”或“有什么意义”?
在第一种情况下 - 答案与“为什么它不支持ARM指令集”相同,“为什么只有2种执行模式”,“为什么向量表很大并且包含地址而不是指令“和”为什么只有2个可能的堆栈指针“:”因为“。因为M-profile具有完全不同的异常模型。 (并且因为异常模型不同,CPSR中的模式位可以用于其他任何东西。)
在第二种情况下......嗯,这取决于开发者,不是吗? 碰巧有一个寄存器保存当前活动的中断ID。如果这对您有益,请使用它。 您可以(例如)使用它将单个中断处理程序地址存储到向量表中的多个位置,然后使用中断ID来识别哪个特定设备已触发中断。
从可重入异常处理的角度来看,这听起来也很方便。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/CHDBIBGJ.html
答案 1 :(得分:1)
这就是你在说什么吗?
The IPSR
The processor writes to the IPSR on exception entry and exit. Software can use an MRS instruction, to read
the IPSR, but the processor ignores writes to the IPSR by an MSR instruction. The IPSR Exception Number
field is defined as follows:
• in Thread mode, the value is 0
• in Handler mode, holds the exception number of the currently-executing exception.
An exception number indicates the currently executing exception and its entry vector, see Exception number
definition on page B1-633 and The vector table on page B1-634.
On reset, the processor is in Thread mode and the Exception Number field of the IPSR is cleared to 0. As a
result, the value 1, the exception number for reset, is a transitory value, that software cannot see as a valid
IPSR Exception Number.
我会看到它类似于ARMv4 / ARM7TDMI中的cpsr,因为它为您提供了执行的状态。如果你在异常中执行,如果是,那么哪一个。由于类似的原因,它可能对芯片设计者有意义,也就是信息或信息的副本被保存的地方。例如,如果已经处于该异常模式,则可能不会重新进入异常处理程序。或者,如果是某种类型的第二个异常,比如在执行预取中止时预取中止,则处理器可能会故意挂起或选择不同的异常。