欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > ARM Coretex-M0核心压栈流程

ARM Coretex-M0核心压栈流程

2025/5/16 7:18:13 来源:https://blog.csdn.net/m0_57249200/article/details/146016545  浏览:    关键词:ARM Coretex-M0核心压栈流程

STM32F013 单片机属于 ARM Cortex-M0 内核架构,其压栈行为主要发生在 异常处理(如中断、异常进入)或者手动使用栈(如函数调用时的局部变量、寄存器保存)时。以下是两种情况的详细分析:


1. 异常或中断触发时的自动压栈

当 STM32F013 发生 中断异常 时,Cortex-M0 内核会自动将以下 8 个寄存器压入栈中(顺序如下):

寄存器说明
R0通用寄存器 R0 (函数参数)
R1通用寄存器 R1
R2通用寄存器 R2
R3通用寄存器 R3
R12通用寄存器 R12
LR (R14)链接寄存器(返回地址)
PC程序计数器(异常发生时的 PC)
xPSR程序状态寄存器

压栈顺序(从低地址到高地址)

低地址↓
[ xPSR  ]  --> 最高位 (最先压入栈)
[   PC   ]
[   LR   ]
[  R12   ]
[  R3    ]
[  R2    ]
[  R1    ]
[  R0    ]  --> 最低位 (最后压入栈)↑
高地址

说明

  • 进入中断或异常时,处理器会自动保存这些寄存器,以便返回时恢复现场。
  • 退出中断时,Cortex-M0 内核会自动从栈中弹出这些寄存器并恢复 CPU 状态。

2. 函数调用时的手动压栈

当函数调用时,编译器和汇编代码可能会手动将一些寄存器压入栈中,以保存调用者的环境。这遵循 ARM AAPCS (ARM Procedure Call Standard) 规则,包括:

  1. 函数参数和局部变量

    • ARM 规定,前 4 个参数传递给 R0-R3,超过 4 个的参数需要压入栈中。
    • 局部变量可能存放在 R4-R7,超出部分也会放入栈中。
  2. 保存寄存器

    • 如果函数内部使用了 R4-R7 或其他非易失性寄存器 (如 LR),需要手动压栈。

示例

push {r4-r7, lr}   ; 进入函数时,保存 r4-r7 和 lr
...
pop {r4-r7, lr}    ; 离开函数时,恢复寄存器
bx lr              ; 返回调用方

说明

  • push {r4-r7, lr} 手动压栈,保护 R4-R7LR(返回地址)。
  • pop {r4-r7, lr} 退出函数时恢复现场。

3. 总结

(1) 进入中断时,Cortex-M0 自动压栈

寄存器内容
R0-R3通用寄存器(函数参数)
R12通用寄存器
LR (R14)链接寄存器(异常返回地址)
PC异常发生时的地址
xPSR程序状态寄存器

(2) 普通函数调用,手动压栈

  • 保护 R4-R7LR 需要 push 指令手动压栈。
  • 超过 4 个的函数参数和局部变量可能会被压入栈中。

这样 STM32F013(Cortex-M0)在不同场景下的压栈机制就清楚了!你具体是想分析哪种情况呢?

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词