静态变量与动态变量基本概念
静态变量:指的是在编译时(compiling-time)变量的地址和大小都已经确定下来的变量
动态变量:指的是在运行时(run-time)变量的地址和大小才开始确定。这个确定不是持续长久的,当程序使用完后,系统会自动删除回收
在嵌入式系统中,为了追求项目的可靠性,因此会较常使用静态变量。
静态变量的基本划分
静态变量可以划分为全局静态变量(global static variable)和局部静态变量(local static variable)。//注:该部分划分仅为个人对static variable 的理解,不代表标准语法。
全局静态变量分为两种:一种是较常见的全局变量(global variable),另一种是通过static 修饰的全局变量。
-> 前者是可以作用在整个工程,其他file或者module需要引用的话,仅需通过extern修饰即可调用。
-> 后者则是仅作用在当前.c文件内,在该文件内是全局可用的(但是不能跨文件调用)
局部静态变量的作用域是在花括号内(即函数内),在函数内声明时,是通过static修饰的,这种变量仅在该函数内有效。作用域与普通局部变量一致,但是生命周期不一致。
静态变量的存储方式
#define UNINT32 unsigned int
static UNINT32 u4TempVariableA = 0x1234;
static UNINT32 u4TempVariableB = 0;
static UNINT32 *pTempPoint = NULL;
static UNINT32 u4TempVariableC;
据已知,code与data都是存放在段(section)中的。但是section又分为data与bss。因此,对于上述code的变量,所存放方式不一样
->对于初始化值非0的u4TempVariableA静态变量来讲,编译器认为其是一种可读写的数据(read/write data),属于RW Data,因此存放在.data section里
->对于初始化值为0的u4TempVariableB,pTempPoint静态变量来讲,编译器认为其明确被初始化定义为0的可读写数据(zero initialized Read/Write Data),属于ZI,因此存放在.bss section里
->对于初始化值没有确定的u4TempCariableC,由于编译器会将其初始化为0,因此也是存放在.bss section里
//补充:变量和代码都是存放在section里,section具体存放的位置则由linker的脚本控制,不同的编译器使用的不一样。在ARM compiler中,使用的是scatter-loading file,IAR与GCC也有对应的linkerscript,后续会出详解