ARM Cortex-M中禁用中断与LDREX/STREX的代价及权衡对比
ARM Cortex-M架构下原子操作:LDREX/STREX 与禁用中断的对比
一、性能代价对比
1. 吞吐量:无冲突场景下的周期消耗
- LDREX/STREX:无冲突时,
LDREX加载变量仅需1-2个周期,STREX存储成功需2-3个周期,完成一次原子检查+设置操作整体约3-5个周期。这类硬件级原子指令无需额外上下文操作,开销极低。 - 禁用中断:需执行
CPSID I(禁用中断)和CPSIE I(恢复中断)两条指令,每条指令占1个周期;加上中间检查并设置volatile bool is_locked的临界区代码,部分Cortex-M内核执行CPSID I后需等待当前指令流完成才生效,无冲突场景下整体耗时约5-8个周期,略高于LDREX/STREX组合。
2. 延迟:中断被延迟的时长
- LDREX/STREX:这类指令不会禁用中断,中断可在指令执行间隙正常响应,中断延迟完全由内核原生中断响应机制决定(通常为十几个周期),原子操作不会额外增加中断延迟。
- 禁用中断:中断延迟等于从
CPSID I执行完毕到CPSIE I执行完成的整个时间段。若临界区仅为简单的检查+设置变量,延迟约为几个到十几个周期;但如果临界区代码复杂,会直接导致中断长时间阻塞,严重时可能破坏系统实时性。
二、其他权衡差异
- 多核兼容性:LDREX/STREX是ARMv6-M及以上架构支持的多核安全原子操作,可在Cortex-M33/M35P等多核平台上实现跨核原子访问;而禁用中断仅对单核有效,多核场景下无法阻止其他核的访问,会引发竞态条件。
- 代码复杂度:LDREX/STREX需要循环处理
STREX失败的情况(比如冲突或中断打断导致STREX返回失败,需重新执行LDREX+操作+STREX),逻辑稍复杂;禁用中断的逻辑更直观,临界区代码直接包裹在开关中断指令之间,易理解和编写。 - 中断安全范围:禁用中断会屏蔽所有可屏蔽中断,包括高优先级中断,可能影响系统实时响应能力;LDREX/STREX不影响中断触发,高优先级中断可正常抢占,系统实时性更有保障。
- 资源占用:
LDREX会占用内核的独占监视器(Exclusive Monitor)资源,嵌套原子操作场景下需注意资源冲突;禁用中断无额外资源占用,仅改变系统中断状态。 - 故障风险:禁用中断后若忘记恢复(比如临界区内触发异常、返回路径出错),会导致系统完全失去中断响应,后果严重;LDREX/STREX即使执行失败,最多是重新进入循环,不会引发系统级故障。
内容的提问来源于stack exchange,提问作者SRobertJames
相关产品推荐
相关产品推荐

