历史上的今天
返回首页

历史上的今天

今天是:2025年03月15日(星期六)

2020年03月15日 | ARM 异常介绍

2020-03-15 来源:eefocus

一、中断概念:

CPU 在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程

硬件引起的中断不可预测,随机性

软中断:事先在程序中安排特殊指令,CPU 执行到该类指令时,转去执行相应的一段预先安排好的程序,然后再返回来执行原来的程序


二、ARM 体系异常分类:

复位异常(Reset)

数据异常(Data Abort)

快速中断异常(FIQ)

外部中断异常(IRQ)

预取异常(Prefetch Abort)

软中断异常(SWI)

未定义异常(Undefined interrupt)


三、异常处理伪代码及 7 种异常

异常处理伪代码:

R14_ = return link

SPSR_ = CPSR

CPSR[4:0] = exception mode number

CPSR[5] = 0 /*进入 ARM 状态*/

If == reset or FIQ then

CPSR[6] = 1 /*屏蔽快速中断 FIQ*/

CPSR[7] = 1 /*屏蔽外部中断 IRQ*/

PC = exception vector address

复位异常

概念

当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,复位异常中断通常用于系统上电和系统复位两种情况。

步骤:

设置异常中断向量表

初始化数据栈和寄存器

初始化存储系统,如系统中的 MMU

初始化关键的 I/O 设备

使能中断

处理器切换到合适的模式

初始化C变量,跳转到应用程序执行

伪代码

R14_svc = UNPREDICTABLE value

SPSR_svc = UNPREDICTABLE value

CPSR[4:0] = 0B10011 /*进入特权模式*/

CPSR[5] = 0 /*处理器进入 ARM 态*/

CPSR[6] = 1 /*禁止快速中断*/

CPSR[7] = 1 /*禁止外设中断*/

If high vectors configured then

PC = 0xffff0000

Else

PC = 0x00000000

未定义指令异常

概念

当 ARM 处理器执行协处理器指令时,它必须等待一个外部协处理器答应后,才能真正执行这条指令。若协处理器没有响应,则发生未定义指令异常。未定义指令异常可用于在没有物理协处理器的系统上,对协处理器进行软件仿真,或通过软件仿真实现指令集扩展。

步骤

将仿真程序入口地址链接到向量表中未定义指令异常中断入口处(0x00000004 或 0xffff0004),并保存原来的中断处理程序

读取该未定义指令的 bits[27:24],判断其是否是一条协处理器指令。如果 bits[27:24]值为 0b1110 或 0b110x,则该指令是一条协处理器指令;否则由软件仿真实现协处理器功能,可以通过 bits[11:8] 来判断要仿真的协处理器功能(类似于 SWI 异常实现机制)

如果不仿真该未定义指令,则程序跳转到原来的未定义指令异常中断的中断处理程序行

伪代码

r14_und = address of next instruction after the undefined instruction

SPSR_und = CPSR

CPSR[4:0] = 0b11011 /*进入未定义指令模式*/

CPSR[5] = 0 /*处理器进入 ARM 状态*/

/*CPSR[6] 保持不变*/

CPSR[7] = 1 /*禁止外设中断*/

If high vectors configured then

PC = 0xffff00004

Else

PC = 0x00000004


软中断异常

概念

这是一个由用户定义的中断指令(SWI)。该异常由执行 SWI 指令产生,可用于用户模式下的程序调用特权操作指令。在实时操作系统中可以通过该机制实现系统功能调用。

伪代码


r14_svc = address of next instruction after the SWI instruction

SPSR_und = CPSR

CPSR[4:0] = 0b10011 /*进入特权模式*/

CPSR[5] = 0 /*处理器进入 ARM 态*/

/*CPSR[6] 保持不变*/

CPSR[7] = 1 /*禁止外设中断*/

If high vectors configured then

PC = 0xffff000C

Else

PC = 0x0000000C


预取异常

概念

预取异常是由系统存储器报告的。当处理器预取的指令的地址不存在,或者该地址不允许当前指令访问(权限不够)时,将产生预取异常。


如果系统中不包含 MMU,指令预取异常中断处理程序只是简单地报告错误并退出;若包含 MMU,引起异常的指令的物理地址被存储到内存中。


伪代码

r14_svc = address of the aborted instruction + 4

SPSR_und = CPSR

CPSR[4:0] = 0b10111

CPSR[5] = 0

/*CPSR[6] 保持不变*/

CPSR[7] = 1 /*禁止外设中断*/

If high vectors configured then

PC = 0xffff000c

Else

PC = 0x0000000c


数据异常

概念

数据异常是由存储器发生数据中止信号,它由存储器访问指令 Load/Store 产生。 

当数据访问指令的目标地址不存在,或者该地址不允许当前指令访问(权限不够)时,将产生数据访问中止异常。

产生数据访问中止异常时,寄存器的值修改规则

r14 的值只与发生数据异常的指令地址有关,与 PC 值无关

如果指令中没有指定基址寄存器回写,则基址寄存器的值不变

如果指令中指定了基址寄存器回写,则寄存器的值和具体芯片的 Abort Models 有关,由芯片的生成商指定

如果指令只加载一个通用寄存器的值,则通用寄存器的值不变

如果是批量加载指令,则寄存器中的值不可预知

如果指令加载协处理器寄存器的值,则被加载寄存器的值不可预知


伪代码

r14_abt = address of the aborted instruction + 8

SPSR_abt = CPSR

CPSR[4:0] = 0b10111

CPSR[5] = 0

/*CPSR[6] 保持不变*/

CPSR[7] = 1 /*禁止外设中断*/

If high vectors configured then

PC = 0xffff0010

Else

PC = 0x00000010


外部中断异常

概念

当处理器的外部中断请求引脚有效,而且 CPSR 的寄存器的 I 控制位被清除时,处理器产生外部中断请求异常中断。系统中各外设通过该异常中断请求处理服务。

伪代码

r14_abt = address of the next instruction to be executed + 4

SPSR_irq = CPSR

CPSR[4:0] = 0b10010 /*进入特权模式*/

CPSR[5] = 0 /*处理器进入 ARM 状态*/

/*CPSR[6] 保持不变*/

CPSR[7] = 1 /*禁止外设中断*/

If high vectors configured then

PC = 0xffff0018

Else

PC = 0x00000018


快速中断异常

概念

当处理器的外部快速中断请求引脚有效,而且 CPSR 的 F 控制位被清除时,处理器产生外部快速中断请求异常中断。


伪代码

r14_abt = address of the next instruction to be executed + 8

SPSR_fiq= CPSR

CPSR[4:0] = 0b10001 /*进入FIQ模式*/

CPSR[5] = 0

CPSR[6] = 1

CPSR[7] = 1 /*禁止外设中断*/

If high vectors configured then

PC = 0xffff001c

Else

PC = 0x0000001c


四、FIQ 与 IRQ 比较

相同点

都只是普通中断:

当我们程序定义了该中断,并且在程序运行的时候产生了 IRQ/FIQ 中断,则此时的芯片运行过程:①中断处理器利用IRQ请求线来告诉ARM,②ARM切换到 IRQ/FIQ 模式运行


不同点

FIQ 速度快,IRQ 速度慢,原因:

FIQ模式提供了更多的寄存器,r8-r14 和 SPSR,而 IRQ 模式只有 r13-r14 和 SPSR,这就意味着在ARM的IRQ模式下,中断处理程序自己要保存R8到R12这几个寄存器,然后退出中断处理时程序要恢复这几个寄存器,而FIQ模式由于这几个寄存器都有banked寄存器,模式切换时CPU自动保存这些值到banked寄存器,退出FIQ模式时自动恢复,所以这个过程FIQ比IRQ快.不要小看这几个寄存器,ARM在编译的时候,如果你FIQ中断处理程序足够用这几个独立的寄存器来运作,它就不会进行通用寄存器的压栈,这样也省了一些时间。


FIQ 比 IRQ 有更高优先级,如果 FIQ 和 IRQ 同时产生,那么 FIQ 先处理。


在symbian系统里,当CPU处于FIQ模式处理FIQ中断的过程中,预取指令异常,未定义指令异常,软中断全被禁止,所有的中断被屏蔽。所以FIQ就会很快执行,不会被其他异常或者中断打断,所以它又比IRQ快了。而IRQ不一样,当ARM处理IRQ模式处理IRQ中断时,如果来了一个FIQ中断请求,那正在执行的IRQ中断处理程序会被抢断,ARM切换到FIQ模式去执行这个FIQ,所以FIQ比IRQ快多了。


另外FIQ的入口地址是0x1c,IRQ的入口地址是0x18。写过完整汇编系统的都比较明白这点的差别,18只能放一条指令,为了不与1C处的FIQ冲突,这个地方只能跳转,而FIQ不一样,1C以后没有任何中断向量表了,这样可以直接在1C处放FIQ的中断处理程序,由于跳转的范围限制,至少少了一条跳转指令。

推荐阅读

史海拾趣

GWP Group公司的发展小趣事

随着技术的不断积累和市场的逐步开拓,安路科技在XXXX年成功推出了其首款高性能FPGA产品。这款产品以其优异的性能、稳定的品质和良好的性价比,迅速赢得了市场的青睐。此后,安路科技的产品线不断丰富,逐渐覆盖了更多应用领域,公司的市场份额也逐年攀升。

微芯(CMOSIC)公司的发展小趣事

在21世纪初,由一群资深的留学归国科学家组成的团队在深圳创立了微芯生物。他们专注于创新药物研发,特别是在小分子药物领域。初创期,公司面临技术难题和资金压力,但他们凭借对技术的执着和深厚的专业背景,成功研发出多款具有突破性的新药候选物,为公司的发展奠定了坚实的基础。

Cal Test Electronics公司的发展小趣事

随着客户需求的多样化,Cal Test Electronics开始关注小批量定制型测试电缆组件的市场。公司利用自身的技术优势和生产能力,为客户提供个性化的定制服务。这些定制产品不仅满足了客户的特殊需求,也提高了公司的市场竞争力。通过这一策略,Cal Test Electronics成功打开了一个全新的市场领域,为公司的发展注入了新的动力。

诚芯微(CXW)公司的发展小趣事

在2009年,诚芯微(CXW)公司在深圳成立,标志着其在中国电子行业的初步涉足。公司创始人凭借对集成电路设计领域的深刻理解和前瞻性的市场洞察,决定专注于电源芯片的研发与设计。初期,公司面临着资金紧张、技术储备不足等挑战,但创始人带领团队坚持自主研发,逐步积累了技术实力。

思瑞浦微电子科技(3PEAK INCORPORATED)公司的发展小趣事

在2021年,诚芯微获得了数千万元的Pre-B轮融资,由中信建投和投控东海入股、时代伯乐加投。这笔融资为公司的发展注入了新的动力。同时,公司还完成了股改,正式更名为深圳市诚芯微科技股份有限公司。股改完成后,诚芯微的治理结构更加完善,为公司未来的发展奠定了坚实的基础。

以上故事仅为概述性描述,实际发展过程中可能涉及更多细节和复杂因素。如需更详细的信息,建议查阅相关新闻报道或行业分析报告。

Grand Halo Technology Co Ltd公司的发展小趣事

经过数年的技术积累和市场拓展,诚芯微在2013年注册了自主品牌CXW,标志着其品牌战略的正式启动。同年,公司推出了一系列具有竞争力的电源芯片产品,凭借其卓越的性能和稳定的品质,逐渐在市场中获得了认可。此外,诚芯微还加强了与上游晶圆制造、封装企业的合作,确保了产品的质量和良率。

问答坊 | AI 解惑

QUARTUS怎么设置全局信号?

在QUARTUS里设置全局信号,是不是只要在ASSIGNMENT EDITOR把某一信号设置成全局信号就成,我这么设置,为什么编译的时候说没有声明?…

查看全部问答>

求助:芯片时序图的详细介绍?

---〓×〓×〓×〓×〓---Addr/DATA 请问上述地址与数据复用时序图中,为什么会有上下两根信号线? 一般的不都是一根的信号线吗,如:s0 s1 s2____/---\\_______ 不知道哪有芯片时序图的详细介绍书籍没?麻烦知道的给指点下,谢谢…

查看全部问答>

明华读卡器校验4442卡密码的问题

4442卡的初始密码为ffffff,这个密码是16进制的,还是ASCII吗?明华读卡器的密码校验函数为:int csc_4442(int icdev, int len, unsigned char* p_string)我把\"ffffff\"作为参数放入,但校验错误。用hex_asc(\"ffffff\", s3, 3) 转换后把s3作为参数 ...…

查看全部问答>

STM32的can总线实验心得

工作模式 bxCAN有3个主要的工作模式:初始化、正常和睡眠模式。 初始化模式 *软件通过对CAN_MCR寄存器的INRQ位置1,来请求bxCAN进入初始化模式,然后等待硬件对CAN_MSR寄存器的INAK位置1来进行确认。 *软件通过对CAN_MCR寄存器的 ...…

查看全部问答>

TIM模块产生PWM

这个是STM32的PWM输出模式,STM32的TIM1模块是增强型的定时器模块,天生就是为电机控制而生,可以产生3组6路PWM,同时每组2路PWM为互补,并可以带有死区,可以用来驱动H桥。 下面的代码,是利用TIM1模块的1、2通道产生一共4路PWM的代码例子, ...…

查看全部问答>

淘宝上买的山寨ST-LINK,出现灵异现象

贪便宜,在淘宝上买了个山寨的ST-LINK。 现在出现了奇怪的问题。 我用的是STM8S207S6,单片机工作电压是5V. ST-LINK的SWIM口,其供电电压时3.3V。 当我的板子不供电的时候,我直接连ST-LINK,由它来供电,我可以把软件down到单片机,并且在 ...…

查看全部问答>

设计一个基于msp430的容积式流量计

具有4~20mA ,RS485,脉冲,三种输出。…

查看全部问答>

memcpy()的参数问题?

memcpy(&secureRamFuncs_runstart, &secureRamFuncs_loadstart, (Uint32)&secureRamFuncs_loadsize); 如题,请问这个函数的三个参数是在什么地方给它付的值?…

查看全部问答>

有没有关于怎么读【芯片组成框图】的资料啊

以前好像在哪里见过介绍的,现在想看看找不见了。 问问大家有没有见过的,拿出来分享一下吧。先谢谢了…

查看全部问答>