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