在 ARM Cortex-M 系列单片机中,普通C函数调用的入栈(压栈)和出栈操作通常由编译器编译后生成的代码管理,而硬件仅负责部分关键操作。以下是详细分析:
1. 函数调用与返回的核心机制
(1) 硬件自动完成的部分
-
返回地址的保存:
当通过BL
(Branch with Link)或BLX
指令调用函数时,**硬件会自动将返回地址(即下一条指令的地址)保存到LR
(Link Register)**中。
例如:BL my_function ; 调用函数,硬件自动将返回地址存入 LR
-
返回地址的恢复:
函数返回时,通过BX LR
或MOV PC, LR
指令,硬件会跳转回LR
中的地址继续执行。
(2) 软件管理的部分
- 寄存器的保存与恢复:
C语言写的函数调用,如果被调用的函数需要修改某些寄存器(如R4-R11
),编译器生成的代码会