找回密码
 注册
关于网站域名变更的通知
查看: 276|回复: 2
打印 上一主题 下一主题

异常和中断

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-10-25 13:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
异常是能够引起程序流偏离正常流程的事件,当异常发生时,正在执行的程序就会被挂起,处理器转而执行一块与该事件相关的代码(异常处理)。事件可以是外部输入,也可以是内部产生的,外部产生的事件通常被称作中断或中断请求(IRQ)。几乎所有的现代处理器都支持异常和中断,微控制器的中断可以由片上外设或软件产生。由此可见,通常我们处理的中断是异常的一种。' }! @) A5 ~2 N, C% Z9 e  I
3 K1 J7 O2 v) p  }# T
每种异常类型都有对应的优先级,有些异常的优先级是固定的,有些是可编程的。' T$ c2 K% h4 t& b* T# Q3 k

$ Y3 d7 g, L! F0 o先说几个概念:) V" b. H7 B1 \6 c
6 e" H# `* z9 q1 q# A4 `
1、不可屏蔽中断(NMI)* y& e, O$ p2 ~( r
NMI同IRQ类似,只是它不能被禁止,并且优先级仅次于复位,它对于工业控制和汽车之类的高可靠性系统非常有用。根据微控制器设计的不同,NMI可以用于掉电处理,也可以连接到看门狗单元,以便在系统停止响应时将系统复位。由于NMI不能被控制寄存器禁止,其响应的及时性就得到了保证。
( r/ y+ h& f# \3 R+ G1 r
: h3 b$ T/ S- {: r' }2、硬件错误
4 E' P' p' l: f/ P" z硬件错误异常用于处理程序执行时产生的错误,这些错误可以是试图执行未知的操作码、总线接口存储器系统的错误,也可以是试图切换至ARM状态之类的非法操作。. H* [) [/ h( z: X. g) t. ]$ E

0 a5 c8 ?5 _  _$ @& u+ n8 `3、SVC(请求管理调用)! N# b! o6 b/ u; X" M2 v& G1 g
SVC指令执行时就会产生SVC异常,其通常用在具有操作系统的系统中,为应用程序提供了访问系统服务的入口。
4 U5 m" m$ r% a4 X2 W8 O) R  ?3 \, Z5 G$ ^
4、PendSV(可挂起的系统调用)' ~4 U/ X% }' w" n# l
PendSV是用于带OS(操作系统)的应用程序的另外一个异常,SVC异常在SVC指令执行后会马上开始,PendSV在这点上有所不同,它可以延迟执行,在OS上使用PendSV就要确保高优先级任务完成后才执行系统调度。: d: X; E% y# Z6 ?! R
, Y8 z0 N% }1 T* s, D# E
5、系统节拍7 v; W7 v6 B1 {, F
NVIC中的Systick定时器为OS应用可以利用的另外一个特性。几乎所有操作系统的运行都需要上下文切换,而这一过程通常需要依靠定时器产生定时中断来完成。. Y! T) l7 g4 e6 L' {( p$ e

5 }# ~" J( A  [' |  ?, X1 Z6、中断% A* @6 Y+ g9 ^% W1 q5 L& G9 ?8 b
中断信号可以连接到片上外设,也可以通过IO端口连接到外部中断源上。外部中断只有在使能后才能使用,如果中断被禁止了,或者处理器正在运行另外一个相同或更高优先级的异常处理,则该中断请求会被存储在挂起状态寄存器中。当高优先级的中断处理完成或返回后,挂起的中断请求才可以执行。NVIC能够接受的中断请求信号可以是高逻辑电平,也可以是中断脉冲。应该注意的是,在微控制器的外部接口中,外部中断信号可以是高电平也可以是低电平,或者可以通过编程配置。
- W# e1 Q' |4 S! }5 {% @1 E# M, z- q' A4 B' \
异常的处理流程7 x# l' D$ k0 A# ?: ]7 l/ w4 o

. ]4 @5 @$ P1 {4 @8 }$ n% x4 d1、接受异常请求
% M9 ?7 ~5 y- X5 }' L! q' a3 f处理器要接受一个异常,需要满足的条件:6 T- `* g& J$ r3 h# a8 w: {
①对于中断和SysTick中断请求,中断必须使能2 F& {4 G: B, W( q% W  U5 d
②处理器正在执行的异常处理的优先级不能相同或更大8 p( n) C8 j) |! O2 E# k1 P% O6 j
③中断屏蔽寄存器没有屏蔽掉异常
; g( ~( w& ]# {% Y4 v  [特别注意一点:对于SVC异常,如果用到SVC指令的异常处理的优先级与SVC异常本身相同或更大,这种情况就会引起硬件错误异常处理的执行。
- o4 e, i. u+ H: H  O7 C
& l! r, g5 F( T0 {# `2、压栈和出栈( a% \/ f; e1 a' O
为了使被中断的程序能正确继续执行,在程序切换至异常处理前,处理器当前状态的一部分应该被保存。不同架构处理器的处理方法不同,有的采用硬件自动处理的方法来备份和恢复处理器状态,看需求,有的是需要程序中增加软件处理过程。5 ]. O6 Q- S* r9 u& Y

  K+ t6 s& q, c% [" J/ P2 N异常处理过程执行到最后时,将会利用执行特殊值来触发异常返回机制。处理器还会查看当前是否还有其他异常需要处理,如果没有,处理器就会恢复之前存储在栈空间的寄存器值,并继续执行中断前的程序。" S& R5 f) G& B" |6 L5 Z$ p

; t+ n: R3 |, r" I) t' ^自动保存和恢复寄存器内容的操作被称为“压栈”和“出栈”,这种机制使得异常处理可以跟普通的C函数一样处理,同时也减小了软件开销以及回路大小,因此也降低了系统的功耗。
" h% F' ^4 p/ R9 ^
& h) T5 I, |& P% k6 V4 x3、异常返回指令) b! T5 L! {( R9 I* v- b
根据处理器的不同中断处理返回有的需要特殊指令,一般都是普通的返回指令,加载到PC中的数值则会触发异常返回,这样就使得异常处理可以和普通的C函数一样使用。0 s* F" p4 K- h% u( B, m
两个不同的指令可以用于异常返回:/ |' X. Z4 E  R0 @/ N/ T
BX  <Reg>q     ;将寄存器中的值加载到PC中
8 W" K9 p# ~; C% E/ y+ V
9 R* a+ H/ m* f( y$ C( ?POP {<Reg1>,<Reg1>,...,PC}  OP指令,PC也是更新的寄存器之一
$ W# Q% T6 f+ c; @当其中一个指令执行,异常返回机制就会启动。
+ c7 F' I1 l$ Z: n& _; c- X9 k" Y  P( B, n
4、末尾连锁
8 n: z5 U/ y5 w6 F' Z5 R如果当其他的异常处理完成后,还有异常处于挂起状态,这时处理器不会返回到中断前的程序,而是重新进入异常处理流程,这也被称作末尾连锁。当末尾连锁发生时,处理器不必马上恢复栈的值,因为如果这么做的话还得重新压栈。异常的末尾连锁降低了异常处理的开销,因此也提高了能耗效率。
6 `, f. c2 Z2 X7 h* d5 s: K; r" |$ Y- \* y# ^: h( p6 b3 {# w
# O0 u. g+ r' K# b- }* [

该用户从未签到

2#
发表于 2021-10-25 14:13 | 只看该作者
硬件错误异常用于处理程序执行时产生的错误

该用户从未签到

3#
发表于 2021-10-25 16:45 | 只看该作者
不同架构处理器的处理方法不同
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-9 04:11 , Processed in 0.078125 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表