zoukankan      html  css  js  c++  java
  • s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

    1.异常中断概述

    在arm架构的处理器中,cpu有7中工作模式,2中工作状态。

    1.CPU模式(Mode):

    7种Mode: 除了usr/sys,其他5种都是异常模式。我们知道中断属于异常的2中,中断有irq,fiq。
    
    usr sys undefined(und) Supervisor(svc) Abort(abt) irq fiq
    用户模式 系统模式 未定义指令异常模 svc管理模式 终止模式(1.指令预取终止(读写某条错误的指令导致终止运行);2.数据访问终止(读写某个非法地址程序终止)) irq中断 快中断

    除了usr模式,其他6中为特权模式。 CPU无法从usr模式直接进入特权模式。不能直接进入特权模式,那么怎么进入特权模式呢?

    可以通过设置CPSR(后面会讲)进入其他模式。

    2种工作State:

    ARM state
    Thumb state(几乎用不上)
    

    3.寄存器:

    (1)通用寄存器:
    (2)备份寄存器(banked register):
    	CPSR:当前程序状态寄存器(Current Program Status Register) 反映程序处在那种状态
    	SPSR:CPSR的备份寄存器 (Saved Program Status Register)  用来保存"被中断前的CPSR"
    

    下图是我们arm状态下的通用寄存器和程序状态寄存器

    R13是SP(栈指针)

    R14是LR(link register),程序跳转或者发成异常时的返回地址

    R15是PC(程序计数器)

    假设cpu执行:

    mov R0, R8
    mov R0,R8_fiq
    

    在usr/System 模式下访问的R8, 但是在FIQ模式下,访问R8是访问FIQ模式专属的R8寄存器,不是同一个物理上的寄存器。
    在5种异常模式中每个模式都有自己专属的R13 R14寄存器,R13用作SP(栈), R14(LR)是用来保存发生异常时的指令地址。

    为什么快中断(FIQ)有那么多专属寄存器?
    这些寄存器称为备份寄存器,我们先看下中断处理流程

    1 保存现场(保存被中断模式的寄存器)---(比如程序正在sys/usr模式下运行,当发生中断时,需要把R0-R14这些寄存器全部保存下来)
    2 异常处理(去分辨是哪一个中断源产生了中断,去执行对应的中断服务程序)
    3 恢复现场(恢复被中断时保存下来的寄存器R0-R14)
    

    但如果是快中断,那么我就不需要保存系统/用户模式下的R8 ~ R12这几个寄存器,因为在FIQ模式下有自己专属的R8 ~ R12寄存器,省略保存寄存器的时间,加快处理速度,所以它才称得上快中断。

    PSR程序状态寄存器
    在异常中断中PSR寄存器会使用的很频繁,PSR寄存器的格式如下图:

    我们再来看看下表,反映的是PSR的 M[4:0]与arm工作模式的关系:

    我们可以按照上图的对应关系设置CPSR,让其进入与之对应的模式。

    4.异常向量表:

    异常向量:不同的异常有不同的入口函数,那么这个异常入口函数的地址就是存放在该异常向量的位置。从该异常向量读取到的数据就是异常入口函数的地址。

    异常向量表就是由异常向量组成的集合。

    下图是我从uboot源代码中截取的smdk2410 的异常向量表:(2440异常向量表也是这个)

    .globl _start
    _start:	b       reset
    	ldr	pc, _undefined_instruction
    	ldr	pc, _software_interrupt
    	ldr	pc, _prefetch_abort
    	ldr	pc, _data_abort
    	ldr	pc, _not_used
    	ldr	pc, _irq
    	ldr	pc, _fiq
    

    异常向量表对应的地址如下图:

    2.异常处理流程

    CPU是如何进入到中断模式,执行中断服务程序的?

    1.中断前:

    下图是中断未触发前的程序执行过程:

    那么如何初始化中断?

    1,设置中断源(使中断能够产生,让CPU知道是哪个中断)
    2,设置中断控制器(设置中断屏蔽,中断优先级)
    3,设置中断总开关CPSR (使能中断)
    

    2.中断产生后:

    举个栗子:按键按下,产生按键irq。

    硬件上的处理流程:

    cpu强制跳转到异常向量表上对应的_irq异常向量(0x18)去读取指令(这个是CPU强制执行的,不需要我们去控制)。

    具体的进入中断向量和中断返回流程见下图:

    进入:
    	(1) LR_异常=PC + offset(具体多少看下图)
    	(2)SPSR_异常=被中断前的程序模式CPSR
    	 (3) CPSR被设置成对应的异常模式
    	(4)跳转到对应的异常向量去执行
    
    退出(返回):进入和退出就是一个逆过程
    	(1)PC= LR_异常 -offset
    	(2)被中断前的程序模式CPSR = SPSR_异常
    	(3)中断结束,清中断
    

    进入异常和返回异常时pc和lr的关系如下图:

    从图中我们发现进入不同异常,offset的值也是有差异的。

    软件上的处理流程:

    1.当跳转到irq异常向量(0x18)后,发现该处是一条跳转指令“ldr pc, _irq”,
    那么会通过ldr绝对跳转指令跳到到真正的中断处理函数_irq去执行。
    2.那么在_irq的函数中我们需要按照之前说的**中断处理流程**去执行:
    	(1)保存现场
    	(2)异常处理(去分辨是哪一个中断源产生了中断,去执行对应的中断服务程序)
    	(3)恢复现场
    

    下面用流程图总结下中断产生后的详细处理过程:

  • 相关阅读:
    Junit单元测试
    win7的6个网络命令
    WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS
    WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp
    woj1019 Curriculum Schedule 输入输出 woj1020 Adjacent Difference 排序
    woj1018(HDU4384)KING KONG 循环群
    woj1016 cherry blossom woj1017 Billiard ball 几何
    woj1013 Barcelet 字符串 woj1014 Doraemon's Flashlight 几何
    woj1012 Thingk and Count DP好题
    woj1010 alternate sum 数学 woj1011 Finding Teamates 数学
  • 原文地址:https://www.cnblogs.com/fuzidage/p/12066599.html
Copyright © 2011-2022 走看看