STM32中 static型变量和函数有什么区别?

本文详细解释了静态变量的概念,包括静态局部变量和静态全程变量的特点及应用,并通过实例展示了静态局部变量如何保持状态。此外,还介绍了静态函数及其可见性限制。

A.  static变量称为静态变量。根据变量的类型可以分为静态局部变量和静态全程变量。
  
    1. 静态局部变量  
    它与局部变量的区别在于: 在函数退出时, 这个变量始终存在, 但不能被其它  
函数使用, 当再次进入该函数时, 将保存上次的结果。其它与局部变量一样。  

    2. 静态全程变量  
   静态全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。
它与全程变量的区别是: 全程变量可以再说明为外部变量(extern), 被其它源文件使
用, 而静态全程变量却不能再被说明为外部的, 即只能被所在的源文件使用。  

例如
void a()
{
    static unsigned char i = 0;
    i++;
}

第一次调用a()后,i的值为1,第二次调用a()后,i的值为2。


B.  static函数
  在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数
不同,它只能在声明它的文件当中可见,不能被其它文件使用。

<think>嗯,用户想了解STM32开发中不同变量区别,特别是全局变量静态全局变量、局部变量静态局部变量之间的区别。首先,我得回忆一下C语言中的变量存储类别作用域。然后结合STM32的具体情况,比如内存分配、存储位置等。 用户之前的问题可能涉及到全局变量是否占用程序存储空间,以及堆栈溢出等问题,现在他想更系统地了解这些变量区别。我需要参考之前的引用内容,尤其是关于全局变量STM32中的分配时机存储位置的信息。首先,全局变量(Global Variables)的作用域是整个程序,生命周期从程序开始到结束。根据引用[1][4],全局变量在程序复位后,进入main函数之前分配,存放在静态存储区,也就是SRAM中。目标代码中不包含全局变量的存储空间,而是包含分配信息,所以BIN文件大小不受其影响。静态全局变量StaticGlobal Variables)的作用域限制在定义它的文件内,其他文件无法访问。存储位置生命周期与普通全局变量相同,也是在静态存储区。这点需要明确,避免用户混淆静态全局普通全局的区别。局部变量(LocalVariables)在函数内部定义,作用域仅限于函数内,存储在栈上。生命周期随着函数的进入退出而创建销毁。引用[2]提到局部变量如s、b存放在栈上,而引用[3]指出栈溢出可能导致全局变量被清零,说明栈空间有限,需注意局部变量的大小。静态局部变量Static LocalVariables)虽然作用域在函数内,但生命周期是整个程序运行期间,存储在静态存储区。每次函数调用时保持值不变。引用[2]中的局部静态变量c存放在全局/静态存储区,全局变量类似,但作用域受限。需要比较这些变量在存储位置、作用域、生命周期初始化方式上的差异。例如,全局静态变量(包括静态全局静态局部)都存放在静态存储区,而普通局部变量在栈上,动态分配的变量在堆上。 另外,用户可能关心这些变量STM32开发中的实际影响,比如栈溢出问题(引用[3]),或者代码大小与变量的关系(引用[1][4])。需要指出使用不同变量时的注意事项,比如避免过大的局部变量导致栈溢出,或者静态变量可能导致的内存占用问题。 可能还需要解释初始化过程,比如未初始化的全局变量会被编译器清零,而局部变量如果不初始化则值不确定。静态局部变量只初始化一次,等等。 最后,生成相关问题,帮助用户进一步理解,比如存储位置的影响、栈溢出防范、变量初始化差异等。确保问题覆盖用户可能遇到的典应用场景问题。</think>### STM32开发中不同变量区别详解 #### 一、全局变量(Global Variables) - **存储位置**:全局变量存储在**静态存储区**(SRAM的全局/静态区),与程序代码分离[^2][^4] - **作用域**:整个工程所有文件可见(需用`extern`声明跨文件访问) - **生命周期**:从程序启动到结束 - **初始化**:未显式初始化时默认被编译器清零[^1] - **示例**:`int g_counter;`(定义在函数外) #### 二、静态全局变量Static Global Variables) - **存储位置**:与普通全局变量相同(静态存储区)[^2] - **作用域**:仅在定义它的源文件内可见 - **生命周期**:同普通全局变量 - **特性**:通过`static`关键字限制作用域,避免命名冲突 - **示例**:`static int s_fileData;`(定义在文件顶部) #### 三、局部变量(Local Variables) - **存储位置**:存储在**栈空间**(Stack)[^2][^3] - **作用域**:仅在定义它的函数/代码块内部 - **生命周期**:函数调用时创建,返回时销毁 - **风险**:大数组可能引发栈溢出(如`char buffer[2048];`会导致全局变量异常清零)[^3] - **示例**:`void func() { int temp = 0; }` #### 四、静态局部变量Static Local Variables) - **存储位置**:存储在**静态存储区**(与全局变量共享区域)[^2] - **作用域**:仅在定义它的函数内 - **生命周期**:程序运行期间持续存在 - **初始化**:仅首次执行时初始化 - **示例**: ```c void counter() { static int s_count = 0; // 只初始化一次 s_count++; } ``` #### 对比表格 | 变量 | 存储位置 | 作用域 | 生命周期 | 初始化特性 | |------------------|----------------|-----------------|-----------------|---------------------| | 全局变量 | 静态存储区 | 全局可见 | 程序运行期间 | 默认清零 | | 静态全局变量 | 静态存储区 | 文件内可见 | 程序运行期间 | 默认清零 | | 局部变量 | 栈空间 | 函数/代码块内 | 函数调用期间 | 不初始化则值随机 | | 静态局部变量 | 静态存储区 | 函数内 | 程序运行期间 | 只初始化一次 | #### 开发注意事项 1. **栈空间管理**:STM32默认栈大小约1KB(在启动文件`startup_stm32fxxx.s`中定义),可通过修改`Stack_Size`调整[^3] ```assembly Stack_Size EQU 0x400 ; 默认1KB栈空间 ``` 2. **静态变量慎用**:过多静态变量会增加SRAM占用,可能导致内存不足 3. **跨文件访问**:推荐使用静态全局变量封装模块内部数据,通过函数接口对外暴露 4. **零初始化机制**:全局/静态变量的清零操作由C库在启动阶段完成,会延长启动时间
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值