一文讲清嵌入式系统中的“中断”


一、中断的基本概念

中断是指在计算机执行程序过程中,遇到某些紧急事件或外部请求等情况时,暂时停止当前正在执行的程序,转而去执行相应的中断服务程序(ISR,Interrupt Service Routine)来处理这些事件,处理完毕后再返回原来被中断的程序继续执行的一种机制。
在这里插入图片描述
在嵌入式系统中,中断使得处理器能够响应异步事件,例如按键输入、传感器信号变化等,这对于需要实时反应的系统来说至关重要。

二、中断的分类

1、根据中断源分类

根据中断源的不同,中断大致可以分为硬件中断和软件中断两类,其中硬件中断又分为外部硬件中断和内部硬件中断。

①、外部硬件中断

由CPU外部的硬件事件触发,如按键、传感器(温度传感器、光线传感器等)、外部设备(如打印机、外部存储设备等)产生的中断信号。这些设备通常通过改变引脚电平或产生信号来发出中断请求。

②、内部硬件中断

像定时器/计数器溢出、CPU内部的异常(如除法错误、非法指令等)。以定时器中断为例,当定时器计数达到设定值并溢出时,会触发中断。

③、软件中断

通过在软件中执行特定的指令来触发,主要用于软件层面的事件处理,比如实现系统调用、任务切换等功能。软件中断在很多情况下用于让应用程序请求操作系统的服务,或在运行时检测到异常情况时执行特定的处理逻辑。

2、根据可屏蔽性分类‌

根据可屏蔽性的不同,中断分为可屏蔽中断和不可屏蔽中断。

①、可屏蔽中断

CPU可以通过设置相关的中断屏蔽寄存器来决定是否响应这类中断。通常用于一些不是特别紧急、可以延迟处理的外部设备中断,如磁盘数据传输完成中断等。

②、不可屏蔽中断

这类中断是CPU必须立即响应的,如电源掉电等紧急情况的中断,不受中断屏蔽寄存器的控制。

三、中断处理过程

中断处理流程的示意图如下:
在这里插入图片描述
具体来说,一个典型的中断处理过程大致包括以下几个步骤:

1、中断请求

当中断源产生中断事件时,会向CPU发送中断请求信号,该信号一般会被锁存到中断控制器中。

2、中断识别与判优‌

CPU在执行完当前指令后,会检查是否有中断请求以及是否允许响应中断(根据中断允许标志位等条件判断)。如果有多个中断源同时请求中断,CPU需要判断哪个中断源的优先级最高,并响应最高优先级的中断请求。

3、中断响应

如果中断条件满足,CPU会暂停当前程序的执行,将当前程序的断点地址(即下一条要执行的指令地址)以及一些重要的寄存器内容(如程序状态字等)保存到堆栈中。
CPU通过查询中断向量表找到对应事件的中断服务程序的入口地址。中断向量表是一个存储在内存中的中断响应地址的映射表,包含了所有可能中断类型的服务例程入口地址。当处理器接收到中断信号时,它会根据中断控制器提供的向量号,在中断向量表中查找相应的ISR地址,并准备跳转到该地址执行中断处理。

4、中断处理

CPU跳转到该地址执行中断服务程序,处理中断事件。中断服务程序应尽可能简短和高效,以减少中断响应时间,并避免在中断处理程序中进行耗时操作或阻塞调用。

5、中断返回

当中断处理程序执行完毕后,通过执行中断返回指令,将之前保存的断点地址和寄存器内容从堆栈中恢复,CPU继续从断点处执行原来被中断的程序。

四、中断管理机制

在嵌入式系统中,中断管理通常包括优先级管理、中断屏蔽等机制,用于处理多中断源的竞争和中断的嵌套调用问题。

1、中断优先级

在多中断源的环境下,不同的中断源可能会同时请求中断。不同的中断源有不同的优先级,当多个中断源同时发出中断请求时,CPU会根据优先级高低来决定先响应哪个中断。
优先级管理确保了更紧急的任务能够优先被处理。每个中断都被分配了一个唯一的优先级值,这个值决定了它在中断队列中的位置。优先级高的中断会先于优先级低的中断得到处理。这种机制确保了关键任务能够及时得到处理,从而提高了系统的实时性和可靠性。中断优先级的配置通常通过编程实现,开发者需要设置NVIC(嵌套向量中断控制器)的相关寄存器来配置每个中断的优先级。

2、中断嵌套

在CPU正在执行一个中断处理程序时,如果有更高优先级的中断请求到来,CPU会暂停当前中断处理程序的执行,转而去响应更高优先级的中断,形成中断嵌套。当高优先级中断处理完毕后,再返回继续执行被打断的中断处理程序。这种机制确保了高优先级任务能够及时得到响应和处理。
在这里插入图片描述

3、中断屏蔽

为了避免中断服务程序被其他更高优先级的中断打断,或在某些关键时刻屏蔽所有中断,中断屏蔽技术被广泛应用。通过设置特定的屏蔽位,可以实现对单个或多个中断源的屏蔽。

五、中断的应用场景

中断在嵌入式系统中有广泛的应用场景,包括但不限于以下几个方面。

1、实时任务处理

在嵌入式系统中,往往有一些任务需要实时处理,如传感器数据的读取、人机交互(如按键)等。通过为这些任务分配较高的中断优先级,可以确保它们能够在其他低优先级的任务之前得到处理。

2、任务调度

在操作系统中,中断也可用于任务调度。例如,利用软件中断实现任务的切换和调度,确保各个任务都能按照一定的规则得到执行。或者当一个高优先级的任务需要运行时,可以通过触发一个高优先级的中断来抢占当前正在运行的低优先级任务。

3、错误处理

当系统发生错误或异常时,如硬件故障、软件错误等,需要尽快处理以防止系统崩溃。通过为错误处理中断分配最高的优先级,可以确保它们能够立即得到响应和处理。

六、注意事项

1、保持ISR简短

中断服务程序应该简短扼要,以便主应用程序可以继续执行。中断的真正目的是处理需要系统注意的紧急事件,因此应该只做当时真正需要做的最少的事情。

2、避免在ISR中调用函数

函数调用开销可能会浪费处理器时间,因此应该尽量避免在ISR中调用函数(除非它们是内联函数)。任何处理器密集型活动,如处理数据缓冲区、执行计算等,都应该设置一个标志,并让主应用程序进行处理。

3、谨慎禁用中断

禁用中断可能是一项极其危险的工作,因为它可能会阻止系统响应外部事件。因此,应该谨慎地禁用中断,并在必要时尽快重新启用它们。

4、共享变量的处理

在ISR中遇到的最大错误之一是共享变量处理不当。如果中断可能修改被应用程序其余部分使用的变量,那么应该使用volatile关键字来声明这些变量。这可以确保在每次使用时都会重新读取变量的值,从而避免使用旧的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式软件测试开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值