s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

时间:2022-12-18 15:28:06

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状态下的通用寄存器和程序状态寄存器

s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

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寄存器的格式如下图:

s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

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

s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

我们可以按照上图的对应关系设置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

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

s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

2.异常处理流程

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

1.中断前:

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

s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

那么如何初始化中断?

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

2.中断产生后:

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

硬件上的处理流程:

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

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

s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

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

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

s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

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

软件上的处理流程:

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

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

s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

s3c2440裸机-异常中断(一. 异常、中断的原理与流程)的更多相关文章

  1. linux中断与异常

    看了<深入理解linux内核>的中断与异常,简单总结了下,如果有错误,望指正! 一 什么是中断和异常 异常又叫同步中断,是当指令执行时由cpu控制单元产生的,之所以称之为异常,是因为只有在 ...

  2. ASM&colon;《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务

    ★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...

  3. Linux的中断 &amp&semi; 中断和异常的区别

    参考 http://www.yesky.com/20010813/192117.shtml 结构化程序设计思想认为:程序 = 数据结构 + 算法.数据结构体现了整个系统的构架,所以数据结构通常都是代码 ...

  4. Linux内核中断和异常分析&lpar;中&rpar;

    在linux内核中,每一个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线.所有现在存在的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连,上次讲到单片机的时候,我就讲到了单片机 ...

  5. Linux内核中断和异常分析&lpar;上&rpar;

    中断,通常被定义为一个事件.打个比方,你烧热水,水沸腾了,这时候你要去关掉烧热水的电磁炉,然后再去办之前手中停不下来的事情.那么热水沸腾就是打断你正常工作的一个信号机制.当然,还有其它的情况,我们以后 ...

  6. 深入理解Linux内核-中断和异常

    Linux内核代码查看 http://androidxref.com/ 中断:被定义位一个事件,它能改变处理器执行指令的顺序.它对应硬件(CPU.其他硬件设备)电路产生的电信号. 同步中断:指令执行时 ...

  7. 《LINUX3&period;0内核源代码分析》第二章:中断和异常 【转】

    转自:http://blog.chinaunix.net/uid-25845340-id-2982887.html 摘要:第二章主要讲述linux如何处理ARM cortex A9多核处理器的中断.异 ...

  8. 《深入理解Linux内核》阅读笔记 --- 第四章 中断和异常

    1.中断的作用:中断信号提供了一种方式,使处理器转而去运行正常控制流之外的代码.当一个中断信号到达时,CPU必须停止它当前所做的事,并切换到一个新的活动.为了做到这一点,就要在内核态堆栈保存程序计数器 ...

  9. x86保护模式-七中断和异常

    x86保护模式-七中断和异常 386相比较之前的cpu   增强了中断处理能力   并且引入了 异常概念 一 80386的中断和异常 为了支持多任务和虚拟存储器等功能,386把外部中断称为中断     ...

随机推荐

  1. IOS轮播图

    轮播图播放的主要技术在于: cell的封装.这里采用UICollectionViewCell实现. #import <UIKit/UIKit.h> @interface CircleVie ...

  2. 转贴 IT外企那点儿事完整版

    转贴 IT外企那点儿事完整版 第一章:外企也就那么回儿事(http://www.cnblogs.com/forfuture1978/archive/2010/04/30/1725341.html) 1 ...

  3. 基于iscroll&period;js实现下拉刷新和上拉加载特效

    现在已经不是纯Android独霸天下的时代了,H5嵌入Android的Hybrid混合开发是大势所趋.今天给大家带来的就是移动端中常见的"上拉刷新,下拉加载"特效,这个特效将会基于 ...

  4. UVa 1388 - Graveyard

    题意:有一个周长为10000的圆上等距分布着n个雕塑,现在又加入m个雕塑,位置随意,希望n+m个雕塑仍然均匀分布.这就要移动其中一些雕像,求移动的最小距离. 这个题的方法很巧妙,首先将整个圆分成(m+ ...

  5. mongoDB数据库备份

    mongodump -h dbhost -d dbname -o dbdirectory 备份mongoDB数据库 重新打开 dos命令框 mongodump -h 127.0.0.1:27017 - ...

  6. 使用Vim进行开发

    从士兵到程序员再到SOHO程序员 (二)   原文地址: http://blog.huhao.name/blog/2013/12/13/become-a-freelancer-2/ 作者:胡皓 Blo ...

  7. 用Node&period;JS&plus;MongoDB搭建个人博客(安装环境)(一)

    Node.JS是什么? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Nod ...

  8. &lt&semi;转&gt&semi;性能测试指标

    下午在家看书,清理收藏栏的内容,翻出来几篇去年收藏的博文,此时再看,真切的感觉到了自己这一年的成长,分享出来,希望看到的童鞋都能有所得,就好... 原文地址:性能测试指标 一.通用指标 指Web应用服 ...

  9. JQuery&lowbar;自带的动画效果

    1.方法: show:显示选中元素. hide:隐藏选中元素. toggle:显示或隐藏选中元素. fadeIn:将选中元素的不透明度逐步提升到100%. fadeOut:将选中元素的不透明度逐步降为 ...

  10. go流程控制与函数

    package main; import ( "fmt" ); func main() { isRun := true; //条件判断 if isRun { fmt.Printf( ...