【ARM】arm异常中断处理知识点
ARM处理器7种类型异常
按优先级从高到低的排列如下:
复位异常(Reset)
数据异常(Date Abort)
快速中断异常(FIQ)
外部中断异常(IRQ)
预取异常(Prefetch Abort)
软件中断异常(SWI)
未定义指令异常(Underfined instruction)
当异常发生时
处理器会把PC设置为一个特定的存储器地址。
这一地址放在被称为向量表(vector table)的特定地址范围内。
向量表的入口是一些跳转指令,跳转到专门处理某个异常或中断的子程序。
当异常发生时,分组寄存器r14和SPSR用于保存处理器状态。
ARM异常处理器模式
每一种异常都会导致内核进入一种特定的模式。
用户和系统模式是仅有的不可通过异常进入的两种模式,也就是说,要进入这两种模式,必须通过编程改变CPSR。
FIQ和IRQ异常中断
ARM内核只有两个外部中断输入信号nFIQ和nIRQ。但对于一个系统来说,中断源可有多达几十个。
为此,在系统集成的时候,一般都会有一个异常控制器来处理异常信号。
这时候用户程序可能存在多个IRQ/FIQ的中断处理函数。为了使从向量表开始的跳转始终能够找到正确的处理函数入口,需要设置一套处理机制和方法。
多数情况下是由软件来处理异常分支的,因为软件可以通过读取中断控制器来获得中断源的信息。
S3C2410X中断控制
1)程序状态寄存器的F位和I位。如果CPSR程序状态寄存器的F位被设置为1,那么CPU将不接受来自中断控制器的FIQ;如果CPSR程序状态寄存器的I位被设置为1,那么CPU将不接受来自中断控制器的IRQ。因此,为了使能FIQ和IRQ,必须先将CPSR程序状态寄存器的F位和I位清零,并且中断屏蔽寄存器INTMSK中相应的位也要清零。
2)中断模式(INTMOD)
ARM920T提供了两种中断模式,即FIQ模式和IRQ模式。
所有的中断源在中断请求时都要确定使用了哪一种中断模式
3)中断挂起寄存器(INTPND)
S3C2410X有两个中断挂起寄存器:源中断挂起寄存器(SRCPND)和中断挂起寄存器(INTPND),用于指示对应的中断是否被激活。
当中断源请求中断的时候,SRCPND寄存器的相应位被置为1,同时INTPND寄存器中也有唯一的一位在仲裁程序后被自动置1。
如果屏蔽位被设置为1,相应的SRCPND位会被置为1,但是INTPND寄存器不会有变化;
如果INTPND被置位,只要标志I或标志F一旦被清零,就会招待相应的中断服务程序。
在中断服务子程序中要先向SRCPND中的相应位写1来清除挂起状态,再用同样的方法来清除INTPND的相应位的挂起状态
4)中断屏蔽寄存器(INTMSK)
当INTMSK寄存器的屏蔽位为1时,对应的中断被禁止;当INTMSK寄存器的屏蔽位为0时,则对应的中断正常执行。
如果一个中断的屏蔽位为1,在该中断发出请求时挂起位还是会被设置为1,但中断请求都不被受理
S3C2410中断控制寄存器
S3C2410X的中断控制器有5个控制寄存器:
源挂起寄存器(SRCPND)、中断模式寄存器(INTMOD)、中断屏蔽寄存器(INTMSK)、中断优先权寄存器(PRIORITY)、中断挂起寄存器(INTPND)。
中断源发出的中断请求首先被寄存器在中断源挂起寄存器(SRCPND)中,INTMOD把中断请求分为两组:快速中断请求(FIQ)和中断请求(IRQ),PRIORITY处理中断的优先级。
1)中断模式控制器(INTMOD)
<注意>中断控制寄存器中只有一个中断源可以被设置为FIQ模式,因此只能在紧急情况下使用FIQ。
2)中断挂起寄存器(INTPND)
当中断请求被响应的时候,相应的位会被设置为1。
在某一时刻只有一个位能为1,因此在中断服务子程序中可以通过判断INTPND来判断哪个中断正在被响应。
在中断服务子程序中必须在清零SRCPND中相应位后清零相应的中断挂起位,清零方法和SRCPND相同
<注意>向INIPND等于“1”的位写入“0”时,INTPND寄存器和INTOFFSET寄存器会有无法预知的结果,因此,千万不要向INTPND的“1”位写入“0”。推荐方法是把INTPND的值重新写入INTPND。
【ARM】arm异常中断处理知识点的更多相关文章
- ARM异常中断处理
ARM异常中断处理 在ARM体系中,通常有以下3种方式控制程序的执行流程: 在正常程序执行过程中,每执行一条ARM指令,程序计数器寄存器(PC)的值加4个字节:每执行一条Thumb指令,程序计数器寄存 ...
- ARM—异常中断处理
文章目录 一. ARM程序执行流程 二. ARM工作模式 三. ARM中异常中断的种类 四. 异常中断向量表及优先级 五. 异常中断用到的寄存器 六. ARM进入处理异常中断时的操作 七. ARM退出 ...
- 浅析arm的异常、中断和arm工作模式的联系
说到异常向量,会让人联想到中断向量.其实,中断是属于异常的子集的,也就是说中断其实是异常其中的一种. 回到异常向量,他其实是一张表格,每个格子里存放的是一个地址,或者是一个跳转命令,不管是哪个,其目的 ...
- ARM对异常的处理
所谓中断就是中断SoC的CPU核(异常可以引起CPU的中断) ARM对异常的处理 1.初始化: 1)设置中断源让它可以产生中断.如某个按键可以产生中断,那么可以设置它的GPIO引脚为中断引脚: 2)设 ...
- C++异常机制知识点
在这里总结一下,C++中的异常机制,以及如何使用异常的知识点 C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决 ...
- STM32程序异常——中断处理要谨慎
问题背景 最近有一个新项目(车载项目),板子上除了原来的ARM + STM32F030K6Tx又多了一个8bit的mcu的单片机,这可真是嵌入式全家福了. 系统的主要核心工作是由arm来完成,但是在开 ...
- 异常 Exception 知识点总结 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- java异常基础知识点
@firstmiki 2017年1月12日12:03:32 一.异常的产生和捕获: package Exception; /** * 演示了java中异常的产生和捕获 * @firstmiki */ ...
- 关于LIst Set Map 异常的知识点---我的笔记
今天新的内容1.List接口2.Set接口3.Map集合4.异常==================================================================== ...
随机推荐
- ios中地图定位
#import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> @interface ViewController ...
- 【转】centos(原生yum系通用)安装xfce便捷方法
一个鸟人突然来了句他要在centos 5.2上装xfce,yum install xfce和yum install xfce4均没有合适的包(服务器没装x环境)于是我ssh登录到服务器上看了下,的确没 ...
- 关于Bigdecimal比较大小
java中对bigdimical比较大小一般用的是bigdemical的compareTo方法: int a = bigdemical.compareTo(bigdemical2);a = 1,表示b ...
- [转]NLP Tasks
Natural Language Processing Tasks and Selected References I've been working on several natural langu ...
- 原创工具binlog2sql:从MySQL binlog得到你要的SQL
从MySQL binlog得到你要的SQL.根据不同设置,你可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等. 用途 数据回滚 主从切换后数据不一致的修复 从binlog生成标准SQL ...
- Windows Server 2008中安装IIS7.0
最近由于需求重新部署了一台服务器Windows Server 2008,由于以前都是在Windows Server 2003上操作,因此记录下,供其他同学参考. 下面主要介绍在Windows Se ...
- 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange
如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...
- numpy ndarray可用的常规函数
该部分位于numpy - ref - 1.14.5中的2.8 available ufuncs 1 数学运算 1.1 元素级加法 add 加法规则: numpy.add(x1, x2, /, out= ...
- Android开发 Fragment中调用startActivityForResult返回错误的requestCode
返回错误的requestCode返回值为65537,在Fragment里调用startActivityForResult,就必须在Fragment里处理onActivityResult.
- memcache 与 redis 为web app 带来的性能提升
memcache 与 redis 为web app 带来的性能提升 参考: 1. http://www.cnblogs.com/ToDoToTry/p/3513688.html