Chinaunix首页 | 论坛 | 博客
  • 博客访问: 117139
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 620
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-24 16:22
文章存档

2014年(53)

我的朋友

分类: 嵌入式

2014-12-14 19:59:37

ARM核的中断支持

重点引用了这篇文章:
~radetzki/Seminar06/08_report.pdf


ARM处理器有7种操作模式
User (usr) 
Normal program execution mode 
FIQ (fiq)
Fast data processing mode
IRQ (irq)
For general purpose interrupts
Supervisor (svc)
A protected mode for the operating system
Abort (abt)
A protected mode for the operating system
Undefined (und)
For undefined instructions
System (sys
Operating system privileged mode

ARM的寄存器根据不同的工作模式而不同,比如在user模式下有R0到R15等16个寄存器,其中R0到R12是通用寄存器,R13是栈寄存器,R15是PC寄存器(存正在执行的下一条指令),R14是subroutine link register。R16是CPSR(current program status register),这个寄存器被所有的模式共享,并且在模式切换的时候发挥主导作用。SPSR寄存器用来做CPSR的备份,全名叫Saved Program Status Register。 
Subroutine Link Register用来返回PC指针到合适的位置,当异常发生时,基于当前PC指针和异常类型给它赋值。某些情况下它应该存储异常处理结束后返回的指令,而在某些情况下,它会返回一两个指令之前的部分。例如内存访问异常,当异常处理完成后,PC会指向同样的指令来重新尝试同一个内存位置。
另外ARM寄存器有一种Banked机制,它会在不同的模式使用不同的替补寄存器。。。但是场上一直都是16个队员(寄存器)。比如每个状态都有不同的物理寄存器来打“SPSR”这个位置。这样就会使模式之间的切换更快,开销更小。因此所有寄存器加起来有37个。如图所示:

异常和中断
ARM里定义能挂起所有当前执行指令的就是异常,所以中断其实是异常的一种。每一个异常都有一个处理程序,并且都会导致ARM核进入一个模式。异常有如下几种,后面是处理异常时进入的模式
异常
模式
Fast Interrupt Request
FIQ
Interrupt Request
IRQ
SWI and RESET
SVC
Instruction fetch or memory access failure
ABT
Undefined Instruction
UND

中断分两种:外部和内部,外部的是硬件中断,分别是IRQ和FIQ,内部的是软件中断,是SWI。
所以可以看出ARM处理中断的模式有三个:SVC、IRQ和FIQ模式。
中断是如何分配的?
SWI用来进行系统调用
IRQ用来进行一般中断如时钟
FIQ保留给需要快速响应的设备如DMA

每个支持中断的系统都必须考虑两个问题,第一是如何处理多个中断?第二是如何减少中断延迟?
总的来说有两个方法:中断优先级和中断嵌套。将二者排列组合,有一些处理策略:
非嵌套不带优先级
非嵌套带优先级
嵌套不带优先级
嵌套带优先级

ARM核提供了各种策略实现的可能性,系统设计者可以在硬件实现,比如在中断控制器;也可以在软件实现,比如Linux。

ARM+Linux的中断处理

在ARM的CPSR中,有一个I位和一个F位,分别用来屏蔽IRQ和FIR,软件可以用指令来设置CPSR已开关中断。
关于IRQ和FIR的逻辑是:IRQ不能打断IRQ,只有FIR能打断IRQ,而且一段时间只能存在一个FIR。所以这是一个很简单的优先级带嵌套的处理策略。
而Linux没有FIR,只有IRQ。所以ARM+Linux是非嵌套并不带优先级的策略。linux在IRQ模式下只是简单的记录是什么中断,马上就切换回了SVC模式,换句话说,Linux的中断处理都是在SVC模式下处理的。

关于时钟中断

时钟中断是由可编程定时/计数器产生的,比如8253或8254芯片,它有一个输入脉冲,有三个输出脉冲,第一个输出脉冲接到中断控制器上,形成时钟中断。在PC上,计时器和时钟中断是两个概念,计时器是CMOS芯片,而时钟中断是有8253产生的。时钟中断的时间精度需要矫正,所以Linux有一个TSC计数器,64位的,用来矫正时间。

详细的需要参考:
http://blog.csdn.net/wdzxl198/article/details/8874859

中断执行后,必然进行任务调度,这样,时钟中断就有了“心跳”的意义。Linux时钟中断是100次每秒,心跳频率。时钟中断提供了一切跟时间相关的所有信息包括系统时间、进程的时间片、延时、使用CPU的时间、各种定时器,进程更新后的时间片为进程调度提供依据。


阅读(2384) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~