zoukankan      html  css  js  c++  java
  • 中断的理解

    中断的理解

    cpu的arm核一般有两类中断,IRQ和FIQ,以rtc中断举例,当arm内核产生了内部中断后,cpu的pending控制器会有一个位进行置1,那么cpu就会拉起和arm核的中断口线,那么arm核就会报告给中断向量表,内核注册中断后就可以有kernel来运行中断处理函数,而中断向量表一般都是些跳转语句,用来跳到中断处理函数的地址位置

    如果cpu不做清中断标志位的动作的话,cpu的pending认为还是置1的状态,那么arm核又会报告给中断向量表,这样对于系统来讲中断是一直从核上产生的;如果清中断标志位的话,那么cpu的pending寄存器置为0,此时就不会上报给中断向量表,那么只有下一次中断来临时才会再产生中断。

    IRQ和FIQ是ARM处理器的两种编程模式。IRQ是指中断模式,FIR是指快速中断模式。对于 FIQ 你必须尽快处理你的事情并离开这个模式。IRQ 可以被 FIQ 所中断,但 IRQ 不能中断 FIQ。为了使 FIQ 更快,所以这种模式有更多的影子寄存器。FIQ 不能调用 SWI(软件中断)。FIQ 还必须禁用中断。如果一个 FIQ 例程必须重新启用中断,则它太慢了,并应该是 IRQ 而不是 FIQ。

    对FIQ你必须进快处理中断请求,并离开这个模式。

    IRQ可以被FIQ所中断,但FIQ不能被IRQ所中断。在处理FIQ时必须要关闭中断。

    FIQ和IRQ是两种不同类型的中断,ARM为了支持这两种不同的中断,提供了对应的叫做FIQ和IRQ处理器模式(ARM有7种处理模式)。

    一般的中断控制器里我们可以配置与控制器相连的某个中断输入是FIQ还是IRQ,所以一个中断是可以指定为FIQ或者IRQ的,为了合理,要求系统更快响应,自身处理所耗时间也很短的中断设置为FIQ,否则就设置了IRQ。

    如果该中断设置为了IRQ,那么当该中断产生的时候,中断处理器通过IRQ请求线告诉ARM,ARM就知道有个IRQ中断来了,然后ARM切换到IRQ模式运行。类似的如果该中断设置为FIQ,那么当该中断产生的时候,中断处理器通过FIQ请求线告诉ARM,ARM就知道有个FIQ中断来了,然后切换到FIQ模式运行。

    简单的对比的话就是FIQ比IRQ快,为什么快呢?

    ARM的FIQ模式提供了更多的banked寄存器,r8到r14还有SPSR,而IRQ模式就没有那么多,R8,R9,R10,R11,R12对应的banked的寄存器就没有,这就意味着在ARM的IRQ模式下,中断处理程序自己要保存R8到R12这几个寄存器,然后退出中断处理时程序要恢复这几个寄存器,而FIQ模式由于这几个寄存器都有banked寄存器,模式切换时CPU自动保存这些值到banked寄存器,退出FIQ模式时自动恢复,所以这个过程FIQ比IRQ快.

    FIQ比IRQ有更高优先级,如果FIQ和IRQ同时产生,那么FIQ先处理。

    在symbian系统里,当CPU处于FIQ模式处理FIQ中断的过程中,预取指令异常,未定义指令异常,软件中断全被禁止,所有的中断被屏蔽。所以FIQ就会很快执行,不会被其他异常或者中断打断,所以它又比IRQ快了。而IRQ不一样,当ARM处理IRQ模式处理IRQ中断时,如果来了一个FIQ中断请求,那正在执行的IRQ中断处理程序会被抢断,ARM切换到FIQ模式去执行这个FIQ,所以FIQ比IRQ快多了。

    另外FIQ的入口地址是0x1c,IRQ的入口地址是0x18。

    ARM 中断处理过程

    转自:http://www.xuebuyuan.com/1444406.html

    1.寄存器R16用作CPSR(Current Program Status Register,当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。

    每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register,备份的程序状态寄存器),当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。

    由于用户模式和系统模式不属于异常模式,他们没有SPSR,当在这两种模式下访问SPSR,结果是未知的

       当中断产生的时候,把CPSR保存在SPSR是自动完成的。

    对异常的响应

    当一个异常出现以后,微处理器会执行以下几步操作: (自动处理的)

    1、将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。例如:在软件中断异常SWI,指令MOV PC,R14_svc总是返回到下一条指令,不管SWI是在状态执行,还是在Thumb状态执行。

    2、将CPSR复制到相应的SPSR中。

    3、根据异常类型,强制设置CPSR的运行模式位。

    4、强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。

    还可以设置中断禁止位,以禁止中断发生。

    如果异常发生时,处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到状态

    从异常返回 (手动处理的)

    异常处理完毕之后,微处理器会执行以下几步操作从异常返回:

    1、将连接寄存器LR的值减去相应的偏移量后送到PC中。

    2、将SPSR复制回CPSR中。

    3、若在进入异常处理时设置了中断禁止位,要在此清除。

    可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。

                                     几种CPU工作模式

    用户模式(User,usr)

    正常程序执行的模式

    快速中断模式(FIQ,fiq)

    用于高速数据传输和通道处理

    外部中断模式(IRQ,irq)

    用户通常的中断使用

    特权模式(Supervisor,sve)

    供操作系统使用的一种保护模式

    数据访问中止模式(Abort,abt)

    用于虚拟存储及存储保护

    未定义指令中止模式(Undefin- ed,und)

    用于支持通过软件仿真硬件的协处理器

    系统模式(System,sys)

    用于运行特权级的操作系统任务

    除用户模式外都是特权模式(任意地进行处理器模式的切换)。。

    除用户模式和系统模式外都是异常模式。

    对不同的中断模式都有独立的堆栈和独立的堆栈指针(SP)和(LR)

    从SWI和Undef异常返回时使用
    movs pc,LR

    从FIQ,IRQ和预取终止返回时使用
    SUBS PC, LR, #4

    从数据异常返回时使用
    SUBS PC, LR, #8

    在使用上述指令异常返回时,如果LR之前被压栈的话使用LDM
    LDMFD SP! {PC}^

    下面是我的联系方式:

    qq:920052390

    新浪博客:http://blog.sina.com.cn/u/2049150530

    博客园:http://www.cnblogs.com/sky-heaven/

    昵称是:张昺华--sky

  • 相关阅读:
    什么是 Linux
    Java常用几种加密算法
    Java多线程
    SpringSecurity相关配置【SpringSecurityConfig】
    应用上下文配置【AppConfig】
    web.xml
    Web上下文配置【MvcConfig】
    SpringMVC4零配置--Web上下文配置【MvcConfig】
    HTML <meta> 标签 遇到<meta http-equiv="refresh" content="0; url=">详解
    java如何获取当前机器ip和容器port
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/5279644.html
Copyright © 2011-2022 走看看