ARM中断和上下文保存

时间:2015-09-30 11:53:12

标签: exception arm interrupt

我试图了解中断如何在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异常?


谢谢。

1 个答案:

答案 0 :(得分:1)

  
      
  1. 当CPSR(状态寄存器)中的I和F位设置为1以禁用外部和快速中断时,其他5个异常是   还残疾?
  2.   

不,这些都取决于您的代码是否正确。例如,编译器通常不会生成swi指令。

  
      
  1. 如果在启用I和F位时未禁用SWI,那么是否可以故意触发ISR内的SWI异常   外部中断?
  2.   

是的,有可能。如果需要,您可以在swi处理程序中检查 SPSR 的模式并中止(或任何适当的)。

  

3.当触发任何中断时将CPSR保存到SPSR,更改模式由处理器本身完成。那么,写作就足够了   ISR处理程序函数并使用处理程序更新向量表   地址(我不想将r0保存到r12通用寄存器)?

没有人想保存寄存器。但是,如果使用r0到r12,那么主代码将会损坏。存储的sp用于存储这些寄存器。此外,向量表不是处理程序地址,而是指令/代码。

  
      
  1. 每当更改执行模式时,处理器内部都会进行上下文保存(即使我们更改模式也是如此)   手动地)?
  2.   

不,矢量页面中的指令/代码负责保存上下文。如果您有一个可预先占用的操作系统,那么您需要保存该进程的上下文并稍后恢复。您可能有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
  
      
  1. 如何屏蔽/禁用SWI异常?
  2.   

你不能这样做。您可以编写一个swi处理程序,除了增加PC之外什么也不做,和/或您可以根据它的作用跳转到 undefined 处理程序。