我试图了解中断如何在ARM体系结构中工作(特定于ARM7TDMI)。我知道有七个例外(复位,数据中止,FIQ,IRQ,预取中止,SWI和未定义指令),它们以特定模式执行(分别为Supervisor,Abort,FIQ,IRQ,Abort,Supervisor和Undefined)。我有以下问题。
1.当CPSR(状态寄存器)中的I和F位设置为1以禁用外部和快速中断时,是否还禁用了其他5个例外?
2.如果在启用I和F位时未禁用SWI,那么是否可以在外部中断的ISR内有意触发SWI异常?
3.当触发任何中断时将CPSR保存到SPSR,更改模式由处理器本身完成。那么,编写ISR处理函数并使用处理程序地址更新向量表(我不想将r0保存到r12通用寄存器)就足够了吗?
4.每当执行模式改变时,处理器内部都会发生上下文保存(即使我们手动更改模式)?
5.如何屏蔽/禁用SWI异常?
谢谢。
答案 0 :(得分:1)
- 当CPSR(状态寄存器)中的I和F位设置为1以禁用外部和快速中断时,其他5个异常是 还残疾?
醇>
不,这些都取决于您的代码是否正确。例如,编译器通常不会生成swi
指令。
- 如果在启用I和F位时未禁用SWI,那么是否可以故意触发ISR内的SWI异常 外部中断?
醇>
是的,有可能。如果需要,您可以在swi
处理程序中检查 SPSR 的模式并中止(或任何适当的)。
3.当触发任何中断时将CPSR保存到SPSR,更改模式由处理器本身完成。那么,写作就足够了 ISR处理程序函数并使用处理程序更新向量表 地址(我不想将r0保存到r12通用寄存器)?
没有人想保存寄存器。但是,如果使用r0到r12,那么主代码将会损坏。存储的sp
用于存储这些寄存器。此外,向量表不是处理程序地址,而是指令/代码。
- 每当更改执行模式时,处理器内部都会进行上下文保存(即使我们更改模式也是如此) 手动地)?
醇>
不,矢量页面中的指令/代码负责保存上下文。如果您有一个可预先占用的操作系统,那么您需要保存该进程的上下文并稍后恢复。您可能有1000个进程。所以CPU无法自动执行此操作。您的上下文保存区域可能植根于super mode
堆栈;在这种情况下,您可以使用ISR / FIQ sp
作为临时寄存器。例如,ARM Linux中的switch_to
函数可能会有所帮助。 thread_info
植根于用户空间进程/线程的内核管理的管理程序堆栈。最小代码(删除了功能)是,
__switch_to:
add ip, r1, #TI_CPU_SAVE @ Get save area to `ip`.
stmia ip!, {r4 - sl, fp, sp, lr} ) @ Store most regs on stack
add r4, r2, #TI_CPU_SAVE @ Get restore area to `r4`
ldmia r4, {r4 - sl, fp, sp, pc} ) @ Load all regs saved previously
@ note the last instruction returns to a previous
@ switch_to call by the destination thread/process
- 如何屏蔽/禁用SWI异常?
醇>
你不能这样做。您可以编写一个swi
处理程序,除了增加PC之外什么也不做,和/或您可以根据它的作用跳转到 undefined 处理程序。