在嵌入式C语言中,需要清晰的知道我们定义的变量都存放在哪些位置。
在C语言中变量可以存放在3个地方:普通内存,运行时的堆栈,CPU内部的通用寄存器。
其中,堆栈当然也是内存,不过相对于普通的内存,堆栈往往是用来暂存数据的,其内容变化非常频繁,所以我们在这里将普通内存与寄存器并列,并且将堆栈分离出来分析。在这3个地方存储的变量具有不同的特性。
变量的存储类型首先取决于它的声明位置。凡是在函数外声明的变量都是全局变量,在默认情况下,全局变量的作用域仅限于声明该变量的C文件中,如果希望在该C文件之外能够访问这个变量,程序员就要在引用该变量的C文件中使用extern关键字对这个变量进行重新声明,或者在定义该变量的.h文件中使用关键字extern重新声明。编译器在编译过程中将全局变量映射在普通内存中,在程序的整个执行过程中,该变量始终占用编译器为它分配的内存空间,它始终保持原来的值,直到对这个变量进行赋值操作或者是程序结束。所以我们也称全局变量为全局静态变量。对于ARM编译器而言,在编译的过程中编译器会生成2个全局变量的“段”:有初值全局变量RW(Read and Write)段和无初值全局变量ZI(Zero Initialized)段,链接器则将所有C文件的RW段和ZI段进行拼接并对其中的全局变量进行重新定位。另外,程序员不能修改全局变量的存储类型,它是静态的。