Cortex-M4 MCU中断服务程序是否必须使用isr属性?
针对Cortex-M4 MCU编写中断服务程序(ISR)时必须使用
isr属性吗? 是的,在Cortex-M4上编写中断服务程序时,必须使用__attribute__((isr))属性——至少在绝大多数实际场景下是硬性要求,原因和编译器生成的代码差异直接相关。
带isr属性的代码示例
extern "C" void SysTick_Handler() __attribute__ ((isr)); extern "C" void SysTick_Handler() { }
这段代码编译后,编译器会生成处理中断上下文的额外汇编指令:
SysTick_Handler: mov r0, sp @, bic r1, r0, #7 @,, mov sp, r1 @, push {r0} @ ldr r0, [sp], #4 @, mov sp, r0 @, bx lr @
省略isr属性的情况
如果去掉isr属性,编译器生成的汇编会极度简化:
SysTick_Handler: bx lr @
为什么必须用isr属性?
Cortex-M系列内核要求中断上下文的栈必须保持8字节对齐,这是硬件强制的规则。isr属性会让编译器自动生成栈对齐的处理逻辑:先保存当前栈指针,调整栈到8字节对齐,退出中断时再恢复原栈指针。
如果省略这个属性,编译器不会做栈对齐处理——一旦你的中断服务程序里执行了需要栈对齐的操作(比如调用其他函数、访问64位变量),就会直接触发HardFault错误,导致系统崩溃。
除此之外,isr属性还会确保编译器按照ARM中断服务程序的规范处理寄存器(比如正确保存/恢复必要的通用寄存器),完全符合AAPCS调用标准对中断上下文的要求。
内容的提问来源于stack exchange,提问作者wimalopaan
相关产品推荐
相关产品推荐

