嵌入式系统中的栈内存管理
stack memory management in embedded systems
在我学习的有关嵌入式系统的课程中,某些陈述缺乏深入的解释,这让我在某些时候感到困惑。如果有人可以向我提供说明,我将不胜感激。
有人告诉我,如果有初始化变量,它们的初始化值存储在代码段中(可能在闪存中),并在之前由启动例程加载(可能是到 RAM) 运行 程序。考虑到将全局变量分配给 .data 部分,这对我来说很有意义。我假设全局变量在整个程序中有一个固定的地址,初始化值被加载到一个特定的地址位置(如果我错了请指正)。现在,考虑到局部变量在堆栈上没有固定地址位置,这是如何完成的?考虑到局部变量仅在函数执行期间才存在,那么每次调用函数时如何初始化它们?
另外,讲师说,“堆栈在编译时保留,数据在运行时由预编译指令分配”。有人可以让我理解这句话的后半部分吗?
您在 .data
部分对静态变量的理解是正确的。您可能还想考虑 .bss
部分中的零初始化静态变量。这些与 .data
部分同时初始化,但它们的初始值不需要存储,因为它是零。
自动变量可能在堆栈上,或者可能被优化为仅在处理器寄存器中。无论哪种方式,每次调用使用它们的函数时,编译器都会生成代码来初始化它们。如果它们在堆栈上,那么这将包括一条指令,用于调整堆栈指针以在需要时为它们“分配”space,并在它们离开上下文时“释放”它们。
整个栈的space通常在链接描述文件中分配。在嵌入式微控制器系统中,不需要指令来“分配”它。根据硬件的不同,可能需要代码来启用对外部存储器的访问,但在大多数情况下,一旦系统启动,就会有一组快速 SRAM 准备好使用,第一个堆栈将在其中。
在我学习的有关嵌入式系统的课程中,某些陈述缺乏深入的解释,这让我在某些时候感到困惑。如果有人可以向我提供说明,我将不胜感激。
有人告诉我,如果有初始化变量,它们的初始化值存储在代码段中(可能在闪存中),并在之前由启动例程加载(可能是到 RAM) 运行 程序。考虑到将全局变量分配给 .data 部分,这对我来说很有意义。我假设全局变量在整个程序中有一个固定的地址,初始化值被加载到一个特定的地址位置(如果我错了请指正)。现在,考虑到局部变量在堆栈上没有固定地址位置,这是如何完成的?考虑到局部变量仅在函数执行期间才存在,那么每次调用函数时如何初始化它们?
另外,讲师说,“堆栈在编译时保留,数据在运行时由预编译指令分配”。有人可以让我理解这句话的后半部分吗?
您在 .data
部分对静态变量的理解是正确的。您可能还想考虑 .bss
部分中的零初始化静态变量。这些与 .data
部分同时初始化,但它们的初始值不需要存储,因为它是零。
自动变量可能在堆栈上,或者可能被优化为仅在处理器寄存器中。无论哪种方式,每次调用使用它们的函数时,编译器都会生成代码来初始化它们。如果它们在堆栈上,那么这将包括一条指令,用于调整堆栈指针以在需要时为它们“分配”space,并在它们离开上下文时“释放”它们。
整个栈的space通常在链接描述文件中分配。在嵌入式微控制器系统中,不需要指令来“分配”它。根据硬件的不同,可能需要代码来启用对外部存储器的访问,但在大多数情况下,一旦系统启动,就会有一组快速 SRAM 准备好使用,第一个堆栈将在其中。