历史上的今天
返回首页

历史上的今天

今天是:2025年04月04日(星期五)

2020年04月04日 | arm 处理器进入和退出异常中断的过程

2020-04-04 来源:eefocus

在介绍arm处理器异常中断处理过程之前,先看一下arm寄存器的基本情况。


从这个博客引用一些知识点https://blog.csdn.net/Rik_Liu/article/details/90215982:

R0~R7:在所有模式下对应的物理寄存器都是相同的,在中断或者异常处理程序中需要对这几个寄存器的数据进行保存;


R8~R12:fiq模式下一组物理寄存器,其余模式下一组物理寄存器;


R13、R14:用户、系统模式共享一组寄存器,其余每个模式各一组寄存器。


R13(SP指针)即栈指针,系统初始化时需对所有模式的SP指针赋值,MCU工作在不同模式下时,栈指针会自动切换;


R14:1、调用子程序时用于保存调用返回地址,2、发生异常时用于保存异常返回地址


R15(程序计数器PC):可以用作通用寄存器(未验证,一旦使用后果自负),部分指令在使用R15时有特殊限制(暂不清楚是哪些指令);

其中状态寄存器cpsr是这样的:

CPSR(当前程序状态寄存器):所有模式下可读写


条件标志位如下


N:Negative,负标志


Z:Zero,0


C:Carry,进位


V:Overflow,溢出


中断标志位如下:


I:1表示禁止IRQ中断响应,0表示允许IRQ中断响应


F:1表示禁止FIQ中断响应,偶表示允许FIQ中断响应


ARM/Thumb控制标志位:


T:0表示执行32 bits的ARM指令,1表示执行16 bits的Thumb指令


模式控制位M0~M4:

有了上面知识以后,再来看一下arm的中断向量是如何分布的。根据协处理器中的中断向量标志位,选择中断向量放在0x0地址还是0xffff0000地址。如果放在0地址,中断向量的地址和优先级如下:


异常类型                       优先级                 工作模式                               异常向量地址   

复位 RESET                   1                        管理模式                                0x00000000    

未定义的指令 UND         6                 未定义指令的终止模式                 0x00000004   


软件中断 SWI                 6                        管理模式                                0x00000008   

指令预取中止 PABT        5                        中止模式                                0x0000000C    

数据访问中止 DABT       2                         中止模式                                0x00000010    

外部中断请求 IRQ          4                      外部中断模式                             0x00000018    

快速中断请求 FIQ          3                      快速中断模式                              0x0000001C  

有了这些基础知识以后,看一下arm处理器如何处理中断响应:


1 arm处理器对异常中断的响应过程

arm处理器对异常中断的响应过程如下:


(1)保存处理器的当前状态,中断屏蔽位以及各条件标志位。这是通过将当前程序状态寄存器cpsr的内容保存到将要执行的异常中断对应的spsr寄存器中实现的,各异常中断有自己的物理spsr寄存器。


(2)设置当前程序状态寄存器cpsr中相应的位。使处理器进入相应的执行模式,并屏蔽中断。


(3)将寄存器lr_mode 设置成返回地址。


(4)将pc设置成该 异常的中断向量入口地址,跳转到相应的异常中断处理程序执行。


具体看各个异常如何处理,下面只分析swi异常中断,irq异常中断,以及数据访问终止异常中断。


1.1 响应swi异常中断(系统调用)

用如下伪代码描述:


R14_srv = address of next instruction after the SWI instruction


SPSP_svc = CPSR


//进入特权模式


CPSR[4:0]=0b10011


//切换到arm状态


CPSR[5]=0


//禁止IRQ异常中断


CPSR[7]=1


if high vectors configured then


PC=0xFFFF0008


else


PC=0x00000008


1.2 响应数据访问中止异常中断

用如下伪代码描述:


R14_srv = address of the aborted instruction +8


SPSP_abt = CPSR


//进入特权模式


CPSR[4:0]=0b10111


//切换到arm状态


CPSR[5]=0


//禁止IRQ异常中断


CPSR[7]=1


if high vectors configured then


PC=0xFFFF0010


else


PC=0x00000010


1.3 响应IRQ异常中断

用如下伪代码描述:


R14_irq = address of next instruction to be executed +4


SPSP_abt = CPSR


//进入特权模式


CPSR[4:0]=0b10111


//切换到arm状态


CPSR[5]=0


//禁止IRQ异常中断


CPSR[7]=1


if high vectors configured then


PC=0xFFFF0010


else


PC=0x00000010


2 从异常中断处理器程序中返回

为了理解ARM异常发生的时候,填写在LR寄存器中的返回地址的不同,先看一下ARM流水线的概念:


流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一。也就是说,通过划分指令执行过程中的不同阶段,并通过并行执行,从而提高指令的执行效率。ARM7处理器采用了三级流水线结构,包括取指(fetch)、译码(decode)、执行(execute)三级。

如上图所示,在执行add r0, r1, #5指令时,第二条指令正在译码阶段,而第三条指令正在取指阶段。在执行第一条指令时,PC寄存器应指向第三条指令。也即,当处理器为三级流水线结构时,PC寄存器总是指向随后的第三条指令。 


当处理器处于ARM指令集状态时,每条指令4字节,所以PC得值为当前指令地址+8


此外,在ARM9中,采用了五级流水线结构,是在ARM7的三级流水线结构后面添加了两个新的过程。因此,指令的执行过程和取指过程还是相隔一个译码过程,因而PC还是指向当前指令随后的第三条指令。 


从异常中断处理程序中返回包括下面两个基本操作:


(1) 恢复被中断的程序的处理器状态,即将SPSR_mode 寄存器内容复制到当前的状态寄存器CPSR中。


(2)返回到发生异常中断的指令的下一条指令处执行,即将lr_mode 寄存器的内容复制到PC中。


下面详细介绍各种异常的返回处理。


2.1 SWI 和未定义指令异常中断处理程序的返回

SWI 和未定义指令异常中断是由当前执行的指令自身产生的,当SWI 和未定义指令异常中断产生时,PC的值还没有更新,它指向当前指令后面第二条指令(对于arm指令集来说,它指向当前执行的指令地址加8个字节的位置),这时中断发生,处理器会把PC-4保存到异常模式下的寄存器lr_mode中。这时PC-4 即指向当前指令的下一条指令。所以返回操作可以直接使用如下指令实现:


MOVS  PC,LR   s后缀会把SPSR_mode寄存器替换CPSR


2.2 IRQ 和FIQ异常中断处理程序的返回

通常处理器执行完当前指令以后,查询是否有IRQ和FIQ到来。如果有中断产生,PC值已经更新,它指向当前指令后面第三条指令(ARM指令集是当前指令地址加12个字节的位置),然后处理器会将PC-4 保存到异常模式下的寄存器lr_mode中。这时PC-4


即指向当前指令后的第二条指令,因此返回操作可通过下面的指令实现:


SUBS PC,LR ,#4


先将LR指令减4,赋值到PC中,同时把SPSR_mode寄存器替换CPSR


2.3 数据访问中止异常中断处理程序的返回

当发生数据访问中止异常中断时(比如缺页异常),程序在处理完异常地址以后,需要返回到该有问题的数据访问处,重新访问该数据。因此数据访问中止异常程序应该返回到产生该数据访问中止异常中断的指令处,而不是像前面两种情况下返回到当前指令的下一条指令。


数据范文中止异常中断是由数据访问指令产生的,当数据访问中止异常中断产生时,程序计数器已经更新,它指向当前指令后面的第二条指令(当前指令指的是异常指令的后一条指令),然后处理器会将PC-4保存到异常模式下的lr_mode中,PC-4 即为当前指令后面那条指令。所以要返回那条异常指令重新执行,lr寄存器必须要减去8


SUBS PC,LR,#8

推荐阅读

史海拾趣

GAIA Converter Inc公司的发展小趣事

随着全球化进程的加速,锋鸣电子(上海总部)于2015年启动了国际化战略。公司首先在东南亚地区设立生产基地,利用当地的成本优势扩大产能。随后,锋鸣电子积极参加国际展会,拓展海外市场,与多家国际知名企业建立了合作关系。通过国际化战略的实施,锋鸣电子不仅提升了品牌知名度,还实现了销售收入的快速增长。

AD Semiconductor公司的发展小趣事

在江苏扬州,一家名为锋鸣电子的公司于2008年成立,起初专注于电子元器件的代工生产。面对激烈的市场竞争,公司创始人李伟决定走技术创新之路。2012年,锋鸣电子成功研发出新一代高灵敏度蜂鸣器,该产品在噪音控制和响应速度上实现了显著突破,迅速获得了国内外市场的认可。此后,公司不断加大研发投入,逐步拓展产品线,成为电子蜂鸣器领域的佼佼者。

Fujitsu America公司的发展小趣事

Fujitsu America作为Fujitsu Limited在北美地区的子公司,其发展历程与Fujitsu全球公司紧密相连。Fujitsu最初成立于1935年,最初是一家电信设备制造商,以生产电话交换机起家。随着技术的不断进步,Fujitsu逐渐扩展到信息与通信技术(ICT)领域,成为全球领先的ICT企业。Fujitsu America在这一过程中发挥了重要作用,不仅继承了Fujitsu在技术创新上的优良传统,还根据北美市场的需求特点,提供了定制化的ICT解决方案和服务,推动了公司在北美市场的快速发展。

Datatronic公司的发展小趣事

随着环保意识的提高,Datatronic公司开始探索绿色发展的道路。公司注重节能减排和资源循环利用,通过改进生产工艺和使用环保材料等方式降低对环境的影响。同时,公司还积极推广绿色产品和技术,引导客户树立绿色消费观念。这些努力使得Datatronic公司在环保方面取得了显著成效,赢得了社会的广泛赞誉。

高通(GENITOP)公司的发展小趣事

随着全球市场的不断拓展,超霸电池的销售网络遍布亚洲、欧洲和北美等多个国家和地区。公司始终坚持绿色环保的生产理念,研发出无汞无镉的电池产品,可随生活垃圾丢弃而不会对环境造成影响。此外,超霸电池还积极参与环保事业,旗下多家工厂获得了UL美国安全试验所废弃物零填埋认证。这些举措不仅彰显了超霸电池的社会责任感,也为其在国际市场上树立了良好的品牌形象。

台湾远翔(Feeling Technology)公司的发展小趣事

随着全球对绿色低碳发展的重视,乔光电子积极响应国家号召,于2021年底开始筹划绿色工厂创建项目。公司引入了产品全生命周期理念,持续开展节能低碳、环境保护工作,建立了质量管理体系、职业健康安全管理体系、环境管理体系和能源管理体系等。通过实施一系列绿色低碳、节能技改措施,如废气粉尘收集与处理系统、造粒珠磨机电机变频改造等,乔光电子实现了万元产值能耗和碳排放强度的逐步改善,为企业的可持续发展奠定了坚实基础。

问答坊 | AI 解惑

既然STM32如此名声鹊起--不得不看看STM32 Primer

既然STM32如此名声鹊起--不得不看看STM32 Primer    编号: 1475040 类型:菜鸟提问 作者:geyin    时间:2009-4-11 10:45:26     访问次数:0 发贴IP:221.232.138.131 投票加精0      & ...…

查看全部问答>

雪天跪地求助:朋友们谁了解ip通信的都进来说说

我们公司100多人,要把目前使用的传统电话系统换成ip的。调研了很多,思科和Avaya东西是不错,可是老板批的钱有限,受用不起,国内一些小厂商的东西又担心稳定性太低。近期朋友推荐一款据说整体性价比还可以的美国捷思锐的中小企业语音通信系统,已 ...…

查看全部问答>

关于ALTIUM DESIGNER 标题框的问题。

更改标题框中TITLE的VALUE值为sd,但是确认后,TITLE未发生任何改变。…

查看全部问答>

CAN总线接口电路的硬件设计

CAN总线接口电路的硬件设计…

查看全部问答>

远程更新操作系统

    谁做过远程更新WINCE操作系统这方面的,这个大致怎样实现,有哪些方式?…

查看全部问答>

新手,串口输出问题,请各位大侠拔刀相助一下

//************************************************************************* //                               串口通信 //环境:C805 ...…

查看全部问答>

*** 请问如何选择 PMOS 的Vgs参数? ***

  我想开关一些设备的供电电源, PCB板画好了, 负载在正极. (原本用可控硅关断接地). 锂电池: 输入电压3.2~4.2; 是个变化的过程, 我要用IO口控制PMOS, 低电平打开, 高电平断开; 这个IO口高电平是3.3v, 低电平0v.  请问我该选择 ...…

查看全部问答>

了解一些锂离子电池寿命的充电和放电的方法

人们一直非常重视提高锂离子电池的容量,以期以物理尺寸最小的电池实现最长的产品工作时间。但是在有些应用中,较长的电池寿命、较多的充电次数或较安全的电池比电池容量更重要。本文介绍几种可以极大延长电池寿命的锂离子电池充电和放电方法。几乎 ...…

查看全部问答>

【深度评测STM32 Nucleo】+st-link utility工具试用

本帖最后由 fyaocn 于 2014-12-15 11:11 编辑 进一步的测试中,从网上搜到了很多适用的工具,其中最傻瓜的就是这个ST-LINK GUI Utility了。把程序下载的板子,可以直接查看到内存的数据,更牛的是可以直接修改,包括运行的中间数据。 STM提供了 ...…

查看全部问答>