嵌入式系统中的堆栈内存管理

问题描述

在我正在学习的有关嵌入式系统的课程中,某些陈述缺乏深入的解释,这让我在某些方面感到困惑。如果有人可以向我提供说明,我将不胜感激。

  1. 我被告知,如果有初始化变量,它们的初始化值存储在代码段中(可能在闪存中)并在运行程序之前由启动例程加载(可能是到 RAM)。考虑到全局变量被分配到 .data 部分,这对我来说是有意义的。我假设全局变量对整个程序有一个固定的地址,并且初始化值被加载到特定的地址位置(如果我错了,请纠正我)。现在,考虑到局部变量在堆栈上没有固定地址位置,这是如何完成的?考虑到局部变量只有在函数执行时才会存在,那么每次调用函数时如何初始化?

  2. 此外,讲师说,“堆栈在编译时保留,数据在运行时通过预编译指令分配”。有人可以让我理解这句话的后半部分吗?

解决方法

您对 .data 部分静态变量的理解是正确的。您可能还需要考虑 .bss 部分中的零初始化静态变量。它们与 .data 部分中的那些同时初始化,但它们的初始值不需要存储,因为它是零。

自动变量可能在堆栈上,也可能被优化为仅在处理器寄存器中。无论哪种方式,每次调用使用它们的函数时,编译器都会生成代码以初始化它们。如果它们在堆栈上,那么这将包括一条指令,用于调整堆栈指针,以便在需要它们时为它们“分配”空间,并在它们脱离上下文时“释放”它们。

整个堆栈的空间通常在链接描述文件中分配。在嵌入式微控制器系统中,不需要任何指令来“分配”它。根据硬件,可能需要一些代码来启用对外部存储器的访问,但在大多数情况下,一旦系统启动,就会有一组快速 SRAM 准备好使用,第一个堆栈将在其中。