嵌入式C中的静态变量理解及解析

静态变量与动态变量基本概念

静态变量:指的是在编译时(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,后续会出详解

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值