嵌入式之ARM体系与架构面试题(三)ARM中断与异常


中断与异常是 ARM 嵌入式系统中 "事件响应" 的核心机制,也是面试高频考点------从基础概念区别,到实战开发中的流程设计、性能优化,都直接考察工程师的底层开发能力。

1 中断与异常有何区别?

**详细解析:**中断和异常的核心差异在于 "触发源 + 同步性",具体对比如下:

|------|----------------------------|----------------------------------------|
| 对比维度 | 中断(Interrupt) | 异常(Exception) |
| 触发源 | 外部硬件(如按键、UART、定时器),产生电信号触发 | 内部软件事件(如非法指令、内存访问错误、软中断),CPU 执行指令时自动触发 |
| 同步性 | 异步(与 CPU 指令执行不同步,随机发生) | 同步(与 CPU 指令执行同步,仅在特定指令执行时触发) |
| 别称 | 异步中断 | 同步中断 |
| 示例 | 按键按下触发的 GPIO 中断、串口接收数据中断 | 除以零错误、未定义指令、SWI 软中断、Segment Fault |

面试简便应答:

  • 中断是外部硬件异步触发(如按键、UART),异常是内部软件同步触发(如非法指令、软中断);
  • 中断随机发生,异常与指令执行绑定。

2 中断与 DMA 有何区别?

**详细解析:**两者的核心差异是 "CPU 是否参与数据传输",具体对比:

|----------|-------------------------------|--------------------------------------|
| 对比维度 | 中断(Interrupt) | DMA(直接内存访问) |
| CPU 参与度 | 必须参与(外设请求→CPU 暂停当前程序→处理事件→返回) | 无需 CPU 参与(外设与内存直接传输数据,CPU 可执行其他任务) |
| 核心用途 | 处理 "事件通知"(如外设就绪、错误报警) | 处理 "大数据传输"(如 Camera 采集、USB 读写、硬盘 IO) |
| 系统吞吐率 | 中等(CPU 被打断,存在上下文切换开销) | 高(CPU 解放,专注核心计算,传输与计算并行) |
| 依赖关系 | DMA 传输完成后,通常会触发中断通知 CPU | 不依赖中断,仅需初始化配置即可独立工作 |

面试简便应答:

  • "中断需要 CPU 参与处理事件,DMA 无需 CPU 介入,外设与内存直接传数据;大数据传输用 DMA 提效,事件通知用中断。"

3 中断能不能睡眠?为什么?下半部能不能睡眠?

详细解析:

1. 中断处理程序(上半部)不能睡眠!核心原因 3 点:
  • 无进程上下文:中断上下文没有task_struct(进程控制块),wake_up_xxx等唤醒函数针对进程,无法唤醒中断上下文;
  • 破坏进程调度:中断时会保存被中断进程的上下文(PC、SP 等),若睡眠调用schedule(),会覆盖当前上下文,导致进程切换异常;
  • 内核不可抢占:中断上下文下内核禁止抢占,睡眠后无法切换到其他进程,直接导致内核挂死。
2. 中断下半部(如 tasklet、工作队列)能否睡眠?分情况:
  • tasklet/softirq:不能睡眠!

原因:运行在中断上下文(共享被中断进程的内核堆栈),无独立进程上下文,本质还是 "中断级执行";

  • 工作队列(workqueue):可以睡眠!

原因:工作队列会将任务提交给内核线程执行,运行在进程上下文(有task_struct),支持调度和阻塞操作。

面试简便应答:

  • "上半部(中断 handler)不能睡眠 ------ 无进程上下文、会导致内核挂死;下半部中,tasklet/softirq 不能睡,工作队列可以睡(进程上下文)。"

4 中断的响应执行流程是什么?

详细解析:

ARM 中断响应是 "硬件触发 + 软件处理" 的完整流程,分 5 步:

  1. 中断请求:外部硬件产生中断信号,通过中断控制器(如 VIC、GIC)向 CPU 发送请求;
  2. 中断响应:CPU 检测到请求,若当前优先级允许,暂停正在执行的指令,保存 "中断上下文"(PC、CPSR、通用寄存器等);
  3. 跳转到中断处理程序:CPU 从异常向量表的 IRQ 入口(0x18)跳转,执行中断控制器初始化、中断源识别;
  4. 执行中断处理:①上半部(Top Half):快进快出,完成关键操作(如读取外设数据、清除中断标志);②下半部(Bottom Half):处理耗时操作(如数据解析、存储),用 tasklet / 工作队列实现;
  5. 恢复上下文:下半部执行完毕,恢复被中断进程的上下文,CPU 返回原程序继续执行。

面试简便应答:

  • CPU 接中断→保存上下文→跳中断处理程序→执行上半部(快处理)→执行下半部(慢处理)→恢复上下文,返回原程序。

5 当一个异常出现以后,ARM 微处理器会执行哪几步操作?

详细解析:

ARM 异常处理是硬件自动触发 + 软件辅助的流程,核心 4 步(硬件自动完成前 3 步,软件处理第 4 步):

  1. 保存返回地址:将下一条指令地址存入对应模式的 LR(链接寄存器);①ARM 状态:LR = 当前 PC + 4/8(取决于异常类型,如 SWI 是 PC+4,数据中止是 PC+8);②Thumb 状态:LR 保存 PC 偏移量,无需区分状态,统一用MOV PC, R14_xxx返回;
  2. 保存 CPSR:将当前程序状态寄存器(CPSR)的值复制到对应模式的 SPSR(已保存程序状态寄存器);
  3. 设置 CPSR:强制修改 CPSR 的 "模式位"(如异常模式设为 SVC/IRQ/FIQ),关闭对应中断(如 IRQ 模式关闭 IRQ 中断);
  4. 跳转到异常处理程序:PC 指向异常向量表对应入口(如 SWI 入口 0x08、IRQ 入口 0x18),执行软件处理逻辑。

面试简便应答:

    1. 保存返回地址到 LR;2. CPSR 复制到 SPSR;3. 设置 CPSR 为异常模式;4. PC 跳异常向量表,执行处理程序。

6 写一个中断服务程序需要注意哪些?如果中断产生后要做较多事情怎么做?

详细解析:

1. 中断服务程序(ISR)编写注意事项:
  • 快进快出:仅处理核心操作(采集数据、清中断标志),耗时操作丢给下半部;
  • 禁止阻塞:不调用sleep()、mutex_lock()等可能阻塞的函数;
  • 正确返回:使用操作系统定义的宏(如 Linux 的IRQ_HANDLED/IRQ_NONE),不自定义返回值;
  • 保护共享资源:若访问全局变量,需用自旋锁(spinlock)保护(中断上下文不能用互斥锁);
  • 清除中断标志:必须在处理后清除硬件中断标志,避免重复触发。
2. 中断后需处理较多事情的解决方案:

采用 "上半部 + 下半部" 拆分:

  • 上半部:在 ISR 中完成 "紧急操作"(如读取外设缓冲区数据、清中断标志);
  • 下半部:用 3 种方式处理耗时操作:
  1. tasklet:适合短耗时、原子性操作(如数据校验、简单解析);
  2. 工作队列:适合长耗时、可阻塞操作(如数据存储到 Flash、网络发送);
  3. 软中断(softirq):适合高频、高性能场景(如网络数据包处理)。

面试简便应答:

  • 写 ISR 要注意快进快出、不阻塞、清中断标志、用正确返回值;多任务拆分给下半部,短活用工 tasklet,长活用工作队列。

7 为什么 FIQ 比 IRQ 要快?

详细解析:

FIQ(快速中断)比 IRQ(一般中断)快的核心原因 4 点,从硬件到软件全面优化:

  1. 专用寄存器更多:FIQ 模式有独立的 R8~R14 寄存器(banked 寄存器),模式切换时 CPU 自动保存 / 恢复,无需软件压栈 / 出栈;IRQ 模式需软件手动保存 R8~R12,耗时更长;
  2. 优先级更高:FIQ 优先级高于 IRQ,同时触发时优先处理 FIQ,不被 IRQ 打断;
  3. 中断屏蔽更强:FIQ 处理期间,会屏蔽所有异常(预取指异常、软中断等),仅响应自身,无打断开销;IRQ 处理时会被 FIQ 打断;
  4. 异常向量地址更优:FIQ 入口地址是 0x1C,后续无其他异常向量,可直接存放处理程序(无需跳转);IRQ 入口 0x18 后紧跟 FIQ 入口,只能放跳转指令,多一次跳转开销。

面试简便应答:

  • FIQ 快是因为:专用寄存器省压栈、优先级更高、屏蔽其他中断、入口地址无需跳转,IRQ 没有这些优化。

8 中断和轮询哪个效率高?怎样决定采用哪种方式实现驱动?

详细解析:

1. 效率不能一概而论,分场景:

  • 轮询(Polling):CPU 主动循环查询外设状态,无中断上下文切换开销;

✅ 适合:外设请求频繁(如高速 ADC 采样、网络设备)、数据量极大的场景(避免频繁中断打断 CPU);

❌ 缺点:CPU 利用率高,空闲时浪费资源;

  • 中断(Interrupt):CPU 被动响应外设请求,空闲时可执行其他任务;

✅ 适合:外设请求频率低(如按键、键盘)、事件触发随机的场景;

❌ 缺点:存在上下文切换开销,频繁中断会降低 CPU 效率。

2. 驱动选型判断标准:

  • 看 "请求频率":高频请求→轮询;低频请求→中断;
  • 看 "数据量":大数据传输→轮询(或 DMA + 中断);小数据事件→中断;
  • 看 "实时性":实时性要求高(如工业控制)→中断;实时性要求低→轮询。

面试简便应答:

  • 没有绝对高效,看场景:高频请求、大数据用轮询;低频请求、事件触发用中断;核心看外设请求频率和数据量。

9 总结

  • 中断 / 异常的本质区别是 "触发源 + 同步性";
  • 中断上半部禁止阻塞,下半部按需选择 tasklet / 工作队列;
  • 效率选型看 "请求频率 + 数据量",FIQ 快在硬件优化。

下一篇将更新**《ARM 体系与架构面试题(四)ARM通信协议篇》**,关注不迷路!如有疑问,欢迎在评论区交流~

相关推荐
沛沛老爹2 小时前
从Web到AI:Agent Skills CI/CD流水线集成实战指南
java·前端·人工智能·ci/cd·架构·llama·rag
檐下翻书1732 小时前
HR人力资源管理流程图在线绘制方法
大数据·人工智能·架构·流程图·论文笔记
代码游侠2 小时前
学习笔记——ARM Cortex-A 裸机开发实战指南
linux·运维·开发语言·前端·arm开发·笔记
番茄灭世神2 小时前
基于VScode搭建GD32开发环境
arm开发·vscode·单片机·cmake·gd32
小程同学>o<2 小时前
嵌入式之ARM体系与架构面试题(二)ARM处理器篇
arm开发·面试·架构·嵌入式软件·嵌入式面试·嵌入式面试资料
代码游侠2 小时前
学习笔记——ARM Cortex-A 裸机开发体系架构
arm开发·笔记·嵌入式硬件·学习·架构
向量引擎3 小时前
2026年AI架构实战:彻底解决OpenAI接口超时与封号,Python调用GPT-5.2/Sora2企业级架构详解(附源码+压测报告)
人工智能·python·架构
墨香幽梦客14 小时前
API 集成的核心安全风险
架构·自动化
沛沛老爹14 小时前
Web开发者转型AI:Agent Skills版本控制与管理实战——从Git到AI技能仓库
java·前端·人工智能·git·架构·rag