我刚刚介绍了我为STM32F4开发板编写的一些简单的C代码。我正在使用GNU Arm Embedded Toolchain构建代码。主要功能很简单:
int main()
{
unsigned int ledOn1 = LED1; // (1 << 12)
unsigned int ledOn2 = LED3; // (1 << 14)
Init(ledOn1, ledOn2); // <-- First breakpoint
while(1);
}
Init功能也很简单:
void Init(int led1, int led2)
{
// Set given LEDs
lightsOn = led1 | led2; // <-- Second breakpoint
// Etc...
}
对我来说有趣的是在进行函数调用时如何将数据压入堆栈。
在调用Init函数的“main”行中设置断点,堆栈指针为0x2001fff0
,堆栈如下所示:
然后在Init()的第一行代码中设置下一个断点 - 行lightsOn = led1 | led2;
。因此,当我们前进时,我们看到堆栈变化如下:
我们看到0x2001FFF0
的旧堆栈指针被压入内存位置0x2001FFEC
的堆栈。并且Init函数的参数也被推送到位置0x2001FFE4
和0x2001FFE0
的堆栈上。但是,我不确定为什么跳过堆栈上的内存地址0x2001FFE8
?任何人吗?