ARM处理器中一共有两种中断,第一种是由外设引发的中断-IRQ、FIQ。第二种是由特殊指令引发的中断-SWI instruction
* 在本章我们主要讲解IRQ和FIQ中断,会包括如下内容:
1. Assigning interrupts
2. Interrupt latency
3. IRQ and FIQ exceptions
4. Basic interrupt stack design and implements
1.Assigning Interrupts
an interrput controller可以处理多个中断请求。
* 为了符合assigning interrupts,系统设计者采用了一套设计标准:
1. 软件中断通常为有权限的系统调用保留
2. IRQ通常被分配给general-purpose interrupts.
3. FIQ are normally reserved for a single interrupt source that requires a fast respose time
2.Interrupt Latency
interrupt service routine(ISR)
中断延迟取决于硬件和软件,系统设计者必须平衡系统关于同时处理多个中断源以及最小化中断延时的设计。
一共有2种方法最小化中断延时:
- use a nested(嵌套) interrupt handler. 这种方法通过在服务中断源的时候reenable interrupts。这样会进一步进入嵌套的中断中。
- 这种方法涉及到优先级。仅仅有高优先级的中断才会打断当前中断。中断控制器会忽略同级以及低级的中断。采用这种方法对time-sensitive interrupts非常重要。
3.IRQ and FIQ Exceptions
IRQ和FIQ中断仅仅在cpsr中相应位置被设置了的时候才会发生。在处理中断之前ARM处理器会将当前在execute stage的指令执行完—这是在设计中断处理函数的时候需要考虑的重要因素,因为一些指令会需要多个周期去执行。
* 补充内容:cpsr中nzcvqjift的i被设置为1的时候会disable IRQ
IRQ中断发生时:
1. spsr_irq保存之前的cpsr
2. cpsr由nzcvqjift_usr变成nzcvqjIft_irq
3. r14_irq(lr) = pc
4. pc = 0x18( set pc to the IRQ entry + 0x18)
3.1 Enabling and Disabling FIQ and IRQ Exceptions
ARM处理器有一个简单的步骤去手动使能中断,通过处理器处于特权级的时候修改cpsr中的值。
步骤分为3步:
- MRS r1, cpsr ;取出cpsr中的值
- BIC r1, #0x80 ;改变其中的值(BIC清除相应位)
- MSR cpsr_c, r1 ;将值保存到cpsr中。
以上是Enable的方法,disable需要的是MSR, ORR, MSR 三步即可完成。
4.Basic Interrupt Stack Design And Implement
异常处理器进一步的使用了栈,每一个模式下都有一个专用的包含sp的寄存器。异常栈的设计依靠如下几个因素:
- 操作系统需求
- 目标硬件
stakc需要两个设计的建议
- 定址决定了栈开始在内存中的哪里。大多数基于ARM的系统都是向下减少的栈—栈顶位于高地址。
- 栈的尺寸,取决于handler是嵌套的还是不嵌套的
一个优秀的栈设计需要避免栈的溢出。有一些软件的技术来识别overflow并且采取相应措施在内存错误发生前修复栈。
有两个主要的技术:
- 使用内存保护
- 在每个routine开始时调用栈检查函数。
Interrupt stack在内存中的位置一共有2个策略。
第一种:Interrupt stack 位于 Vector table之上。
第二种:Interrupt Stack 位于User Stack之上。
第一种方法会在栈溢出的时候破坏Vector table导致无法采用一些策略来处理溢出问题。而第二种方法,溢出的时候只会影响用户栈,系统可以通过中断向量表来采取一些措施修复溢出问题。
- 初始化代码需要为所有处理器模式set up 栈寄存器。栈寄存器r13是一种在模式改变的时候总是会被banked的寄存器之一。
如下例子展示了如何在reset后设置stack寄存器
LDR r13, SVC_NEWSTACK ; r13_svc
...
SVC_NEWSTACK
DCD SVC_Stack //DCD 数据定义伪指令:用于连续分配的依恋字存储单元,并且用指定数据初始化。
- 每一个模式使用一个分离的栈具有一个重要的优点:错误的任务可以被纠正并且独立于系统的其他部分