ARM中断与架构知识 精简知识点
一、ARM系统的异常与中断

1、赋予了中断号并使能中断的外设,发生中断(这些中断属于一种异常)时,发出信号给中断控制器(GIC、ICTL等),中断控制器再发送信号给CPU;
2、指令不对,数据访问有问题,reset信号,这些都可以中断CPU。
二、CPU模式与寄存器
1、ARM CPU模式
usr :正常模式。除了该模式,其他都叫特权模式
und :未定义模式
svc :管理模式
abt :终止模式
IRQ :中断模式
FIQ :快中断模式
sys :系统模式
2、ARM CPU state,两种指令集
ARM state
Thumb state
3、ARM CPU寄存器:
(1)通用寄存器,其中3个特殊的:
程序计数器(PC)用的寄存器是R15,用于保存处理器要取的下一条指令地址
堆栈指针(SP)用的是R13,用于保存当前处理器工作模式下堆栈的栈顶地址。栈一般是从高地址往下增长的,详细可看下文解析:
https://blog.csdn.net/u011124985/article/details/81529808
链接寄存器(LR)用的是R14,用于保存子程序的返回地址,当子程序的返回地址保存在堆栈中时,R14也可作为通用寄存器。
(2)备份寄存器(banked register)
(3)当前程序状态寄存器(Current Program Status Register);CPSR
(4)CPSR的备份寄存器:SPSR(Save Program Status Register)
注:usr用户模式可以编程操作CPSR,进入其他模式
寄存器如下图,其中灰色的三角形,表示该模式下的专属寄存器;其他为各个模式共用的寄存器。
可以看到,五种异常模式中每个模式都有自己专属的R13 R14寄存器,R13用作SP(栈) R14用作LR(返回地址):

引申介绍一下存储空间中的数据存放
text段(代码段),存放运行的指令数据;
data段(数据段),存放初始化非0的全局变量;
bss段,存放未初始化的和初始化为0的全局变量;
堆段,由用户申请和释放。申请时至少分配虚存,当真正写数据时才分配对应的实存,释放时也并不是马上释放实存,而是可能被反复利用;
栈段,由系统负责申请释放,其操作方式类似数据结构的栈,用于存储參数变量及局部变量,函数的运行也是栈的方式,所以才有了递归;
参数和全局环境变量区,存储程序运行时从shell中传入的参数和环境变量。

4、ARM三级流水线介绍
ARM处理器使用流水线来增加处理器指令流的速度:以下三个流程是一直在同时执行的:
(1)取指(从存储器装载一条指令);(第三条指令)
(2)译码(识别将要被执行的指令);(第二条指令)
(3)执行(处理指令并将结果写回寄存器)。(正在执行,第一条指令)
R15(PC)总是指向“正在取指”的指令。
习惯性将“执行”的指令称为当前第一条指令,因此PC总是指向第三条指令。
即:PC值=当前程序执行地址+8。(ARM指令集下)
当中断发生时,保存的是pc的值,那么中间就有一个指令没有执行(译码)!
所以中断返回是:SUB pc lr-irq #4。(中断返回在后文有讲)
三、arm对异常(中断)处理过程
1、初始化:
a 、设置中断源,让它可以产生中断(TIMER)
b 、设置中断控制器(屏蔽使能某个中断,设置优先级)
c 、设置CPU总开关(使能中断)
2、产生中断:
按下按键--->中断控制器--->CPU
对于不同的异常,CPU跳去不同的地址执行程序。
ldr pc, irq_addr/* vector 0x18 : irq */
该地址是一条跳转指令,最终跳去执行异常处理函数,这个就是异常向量。
注意:
异常发生后,CPSR的值保存到SPSR_xxx、切换到xxx模式、CPU跳到异常向量,例如0x00000008,都是硬件决定的;
中断向量跳到哪个处理函数,是软件决定的。
3、处理过程:
a 、保存现场(各种寄存器)
发生中断时,需要把R0 ~ R14这些寄存器全部保存下来,然后处理异常,最后恢复这些寄存器。
但如果是快中断FIQ,那么我就不需要保存 系统/用户模式下的R8 ~ R12这几个寄存器,在FIQ模式下有自己专属的R8 ~ R12寄存器,省略保存寄存器的时间,加快处理速度,但是在Linux中并不会使用FIQ模式。
b 、处理异常(中断):分辨中断源,再调用不同的处理函数
c 、恢复现场
ldr pc, irq_addr/* vector 0x18 : irq */
irq_addr:
.word do_irq
/*注:.align 4 是让该指令下面的代码进行4字节对齐!不是上面 */
.align 4
do_irq:
/*设置该模式的栈顶,每个模式栈不同、不重叠,例如0x33FF0000、0x33FE0000*/
ldr sp, =0x33FD0000
/* 在und异常处理函数中有可能会修改r0-r12, 所以先保存 */
/* lr是异常处理完后的返回地址, 也要保存 */
sub lr, lr, #4
stmdb sp!, {r0-r12, lr}
/* 处理irq */
bl handle_irq_c
/* 恢复现场,会把spsr的值恢复到cpsr里 */
ldmia sp!, {r0-r12, pc}^
CRSR当前程序状态寄存器,这是一个特别重要的寄存器,格式如下:

M0-M4代表的模式:

Bit5 State bits表示CPU用的指令集是什么
Bit6 FIQ disable当bit6等于1时,禁止所有的FIQ中断,这个位是FIQ的总开关
Bit7 IRQ disable当bit5等于1时,禁止所有的IRQ中断,这个位是IRQ的总开关
Bit8 ~ Bit27是保留位
Bite28 ~ Bit31是状态位:
28 V :
29 C :
30 Z :比较相等,Z=1
31 N :
SPSR:发生异常时这个寄存器会用来保存被中断的模式下的CPSR
比如程序在sys模式下运行,CPSR值为X,当发生IRQ中断时会进入irq模式,这个SPSR_irq就保存系统模式下的CPSR的值X。
很好理解,因为这样才能从irq模式,恢复到sys模式!
4、我们来看看发生异常时CPU是如何协同工作的:
进入异常的处理流程(CPU硬件)
a、把下一条指令的地址保存在LR寄存器里
b、把CPSR保存在SPSR里面(某种异常模式下SPSR里面的值等于异常前的模式的CPSR)
c、修改CPSR的模式为进入异常模式
d、跳到向量表
5、返回异常前
a 、lr是根据下表取值后赋值给pc:

例如,如果发生的是SWI可以把 R14_svc赋值给PC,如果发生的是IRQ可以把R14_irq的值减去4赋值给PC
b 、把CPSR的值恢复(CPSR 值等于 某一个异常模式下的SPSR)
c 、清中断(如果是中断的话,对于其他异常不用设置)
ARM中断与架构知识 精简知识点的更多相关文章
- ARM CORTEX-M3 内核架构理解归纳
ARM CORTEX-M3 内核架构理解归纳 来源:网络 个人觉得对CM3架构归纳的非常不错,因此转载 基于<ARM-CORTEX M3 权威指南>做学习总结: 在我看来,Cotex-M3 ...
- ARM内核和架构都是什么意思,它们到底是什么关系?
ARM产品越来越丰富,命名也越来越多.很多朋友提问: ARM内核和架构都是什么意思?内核和架构的关系是什么?比如ARMv7架构,这个架构指的是什么?小编选出了几个精彩回答!希望对嵌友们在选择设计电路时 ...
- 关于ARM内核与架构的解释
本文摘自某论坛某位大神的一段回复,经典至极,copy来己用! 只要你玩过ARM内核的芯片,那么关于内核和架构,我想应该或多或少的困惑过你,看了下面的介绍,你应该会清楚很多! 好比你盖房子,刚开始因为水 ...
- linux-2.6.26内核中ARM中断实现详解(转)
转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...
- 基於tiny4412的Linux內核移植 --- 实例学习中断背后的知识(2)
作者:彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台 tiny4412 ADK Linux-4.9 概述 前面一篇博文基於tiny4412的Linux內核移 ...
- ARM和X86架构
重温下CPU是什么 中央处理单元(CPU)主要由运算器.控制器.寄存器三部分组成.运算器起着运算的作用,控制器负责发出CPU每条指令所需要的信息,寄存器保存运算或者指令的一些临时文件以保证更高的速度. ...
- ARM 中断状态和SVC状态的堆栈切换 (异常)【转】
转自:http://blog.csdn.net/edwardlulinux/article/details/9261393 版权声明:本文为博主原创文章,未经博主允许不得转载. ARM 中断状态和SV ...
- ARM内核和架构
转:深入浅谈,CPU设计原理 CPU的内部架构和工作原理 推荐一本书:编码的奥秘 一.ARM内核和架构 ARM产品越来越丰富,命名也越来越多.很多朋友提问: ARM内核和架构都是什么 ...
- 【ARM】---关于ARM内核与架构的解释
本文摘自某论坛某位大神的一段回复,经典至极,copy来己用! 只要你玩过ARM内核的芯片,那么关于内核和架构,我想应该或多或少的困惑过你,看了下面的介绍,你应该会清楚很多! 好比你盖房子,刚开始因为水 ...
随机推荐
- DelayQueue延迟队列-实现缓存
延迟阻塞队列DelayQueue DelayQueue 是一个支持延时获取元素的阻塞队列, 内部采用优先队列 PriorityQueue 存储元素, 同时元素必须实现 Delayed 接口:在创建元素 ...
- 赠送4本《 PHP 程序员面试笔试宝典》
< PHP 程序员面试笔试宝典>历时一年,由机械工业出版社出版,在 2018 年 11 月问世.全书共八个章节,涉及 面试笔试经验技巧.PHP 基础知识.PHP 进阶知识,PHP 面向对象 ...
- c++ 程序编译后运行时的内存分配
程序编译后运行时的内存分配 太好的文章了,看到不得不转,转自:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html 一.编译时与运行时的内存情况 1 ...
- GitLab API使用小结
GitLab API使用小结 背景描述 需求描述: 最近因为工作上的需求,需要对GitLab进行大批量的操作,又因为服务器不在境内,所以所有的操作都需要连接VPN来进行FQ访问.目前大概有6000多个 ...
- C#控制树莓派入门
何为树莓派 许久没有写博客了,十二月份西安疫情的影响,居家隔离了一个多月,在其期间,学习了一下树莓派,觉得硬件还是挺有意思的,刚好也看到了巨硬有提供使用c#用来开发树莓派应用的解决方案叫Net Iot ...
- Python 中 base64 编码与解码
base64 是经常使用的一种加密方式,在 Python 中有专门的库支持. 本文主要介绍在 Python2 和 Python3 中的使用区别: 在 Python2 环境: Python 2.7.16 ...
- C# 9.0元组 (ValueTuple)详细解说
元组 (ValueTuple)类型是值类型:元组元素是公共字段,可以使用任意数量的元素定义元组.Tuple类型像一个口袋,在出门前可以把所需的任何东西一股脑地放在里面.您可以将钥匙.驾驶证.便笺簿和钢 ...
- C#爬虫(02):Web browser控件CefSharp的使用
一.CefSharp介绍 CEF 全称是Chromium Embedded Framework(Chromium嵌入式框架),是个基于Google Chromium项目的开源Web browser控件 ...
- JAVA只要掌握内部类,多继承和单继承都不是问题
摘要:如果实现java的多继承,其实很简单,关键是对于内部类的特征的掌握,内部类可以继承一个与外部类无关的类,保证了内部类天然独立性,根据这个特性从而实现一个类可以继承多个类的效果. 本文分享自华为云 ...
- Ng ML笔记
目录 一.线性回归 1,假设函数.代价函数,梯度下降 2,特征处理 3,代价函数和学习速率 4,特征和多项式回归 5,正规方程 二.逻辑回归(Logistic Regression,LR) 1,假设函 ...