尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

两种常见开关中断方式对比

两种常见开关中断方式对比
📅 发布时间:2026/6/17 21:39:13

经常会遇到两种典型的中断禁用 / 启用实现:一种是基于纯汇编编写的Arch_IntSave/Arch_IntDisable函数,另一种是编译器内置的__enable_irq/__disable_irq内联函数,这两种的区别和功能具体拆解一下。

一、核心实现与功能拆解

1. 纯汇编实现:Arch_IntSave/Arch_IntDisable

.globl Arch_IntSave Arch_IntSave: MRS R0, PRIMASK @ 读取PRIMASK寄存器值到R0 CPSID I @ 禁用IRQ中断 BX LR @ 返回 .globl Arch_IntDisable Arch_IntDisable: CPSID I @ 禁用IRQ中断 BX LR @ 返回
  • 核心指令解析:
    • MRS R0, PRIMASK:将 PRIMASK 寄存器(ARM Cortex-M 核心的中断屏蔽寄存器)的值读取到通用寄存器 R0 中。PRIMASK 是 1 位寄存器,值为 0 时表示中断未屏蔽,值为 1 时表示仅屏蔽普通 IRQ 中断(硬件 FAULT 类异常不受影响)。
    • CPSID I:修改 CPSR(当前程序状态寄存器)的 I 位,直接禁用所有普通 IRQ 中断。
    • BX LR:函数返回,ARM 汇编中通过链接寄存器 LR 返回调用处。

2. 编译器内联汇编实现:__enable_irq/__disable_irq

/** \brief Enable IRQ Interrupts \details Enables IRQ interrupts by clearing the I-bit in the CPSR. Can only be executed in Privileged modes. */ __STATIC_FORCEINLINE void __enable_irq(void) { __ASM volatile ("cpsie i" : : : "memory"); } /** \brief Disable IRQ Interrupts \details Disables IRQ interrupts by setting the I-bit in the CPSR. Can only be executed in Privileged modes. */ __STATIC_FORCEINLINE void __disable_irq(void) { __ASM volatile ("cpsid i" : : : "memory"); }
  • 核心指令解析:
    • __STATIC_FORCEINLINE:编译器强内联关键字,确保函数直接嵌入调用处,无函数调用开销。
    • __ASM volatile ("cpsie/cpsid i" : : : "memory"):内联汇编执行中断开关指令,volatile防止编译器优化该指令,memory约束告知编译器该指令会修改内存状态,避免内存重排序。
    • cpsie i:清除 CPSR 的 I 位,启用 IRQ 中断;cpsid i:设置 CPSR 的 I 位,禁用 IRQ 中断。

二、核心区别对比

1. 功能完整性:“仅禁用” vs “保存 + 禁用”

这是二者最核心的区别,也是嵌入式开发中最易踩坑的点:

  • Arch_IntDisable:仅执行CPSID I,单纯禁用中断,无任何状态保存;Arch_IntSave则在禁用中断前,先读取当前 PRIMASK 寄存器的值并通过 R0 返回 —— 这意味着Arch_IntSave能保存中断禁用前的原始状态。
  • __disable_irq:仅执行cpsid i禁用中断,无状态保存;__enable_irq仅执行cpsie i启用中断,二者均不涉及任何中断状态的读取或保存。

直接调用__disable_irq后调用__enable_irq,可能破坏系统原有中断状态 —— 若调用__disable_irq前中断已被禁用,执行__enable_irq会错误启用中断,导致临界区保护失效。

2. 调用开销:汇编函数 vs 内联函数

  • Arch_IntSave/Arch_IntDisable:作为独立汇编函数,调用时会产生函数调用开销(如 LR 寄存器入栈、PC 跳转),在对执行效率要求极高的临界区(如实时性要求微秒级的外设操作)中,额外开销可能影响性能。
  • __enable_irq/__disable_irq:通过__STATIC_FORCEINLINE实现强内联,汇编指令直接嵌入调用处,无函数调用开销,执行效率与直接写汇编指令一致。

内联汇编的中断操作指令,在编译器优化开启时(-O2/-O3),执行周期与纯汇编指令完全一致,且避免了函数调用的栈操作开销。

3. 状态恢复能力:可精准恢复 vs 强制恢复

  • Arch_IntSave:返回值为中断禁用前的 PRIMASK 状态,开发者可保存该值,在临界区结束后通过MSR PRIMASK, R0恢复原始中断状态 —— 即使调用前中断已被禁用,也不会错误启用。示例:
    ; 调用Arch_IntSave保存状态并禁用中断 BL Arch_IntSave PUSH R0 ; 保存原始PRIMASK值到栈 ; 临界区代码(如操作共享资源) POP R0 ; 取出原始PRIMASK值 MSR PRIMASK, R0 ; 恢复中断状态(而非强制启用)
  • __enable_irq:强制执行cpsie i启用中断,无论调用前中断状态如何,都会直接开启 IRQ—— 若临界区嵌套调用(如 A 函数禁用中断后调用 B 函数,B 函数执行__enable_irq),会导致 A 函数的临界区失去中断保护。

4. 可移植性与编译器兼容性

  • Arch_IntSave/Arch_IntDisable:纯汇编代码,与编译器无关(如 ARMCC、GCC、Clang 均可兼容),但依赖具体的 ARM 内核架构(仅适用于 Cortex-M 系列)。
  • __enable_irq/__disable_irq:属于编译器内置函数(如 ARMCC 的cmsis_gcc.h、cmsis_armcc.h中定义),不同编译器的实现可能略有差异(如 GCC 需添加memory约束,ARMCC 则无需),但符合 CMSIS 标准的编译器均提供该接口,可移植性更强。

三、使用场景选择

1. 优先使用 Arch_IntSave 的场景

  • 临界区嵌套调用:如中断服务函数中调用其他需要禁用中断的函数,需保存原始中断状态,避免错误启用;
  • 精准控制中断状态:如仅临时禁用中断,执行完临界区后需完全恢复原有状态(而非强制启用);
  • 底层内核代码:如操作系统的任务切换、锁机制实现,需最大程度保证中断状态的准确性。

2. 优先使用__enable_irq/__disable_irq 的场景

  • 简单临界区:无嵌套调用的单次中断禁用 / 启用,如单次读写外设寄存器;
  • 跨编译器开发:项目需兼容 ARMCC、GCC 等多种编译器,遵循 CMSIS 标准;
  • 对执行效率要求极高:内联函数无调用开销,适合微秒级响应的实时场景。

相关新闻

  • 软件工程基础第四次作业
  • Python在微服务分布式设置中心与动态服务发现中的架构设计实践
  • Windows系统文件user32.dll丢失损坏 下载修复

最新新闻

  • 深入解析MPC8572DS PIXIS FPGA:系统控制核心与硬件启动全流程
  • 油痘肌泥膜推荐 平价好用清洁泥膜,去除黑头优先选这款 - 全网最美
  • 雅思哥机考软件荣获华为2026“鸿蒙办公创新合作奖”:真实模考体验全面解析 - 品牌2026
  • 2026合肥本土GEO/SEO优化实测解析:本土全链路AI搜索服务商深度测评 - 行业深度观察C
  • Google Colab工程化实践:构建可复现、抗中断、易协作的AI开发环境
  • 2026黄金回收机构实力排名!大连5大正规平台实测,黄金变现靠谱选择 - 奢品小当家

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号