单片机的变量存储

变量在RAM。
RAM是数据存储器,用来保存运行中的数据,掉电后数据消失。eeprom也是用来存变量的,但是eeprom在断电后数据还在,RAM断电后数据就没了

EEPROM跟FLASH都是程序存储器,保存程序代码跟不分配内存的常量,两者的区别在于写入方式EEPROM是电擦除、写入,FLASH就跟手机内存卡一样

const修饰的东西是在ram的,只有code才是rom。取地址直接用取值运算即可

### 单片机变量存储方式 在单片机系统中,变量存储方式与其内存结构密切相关。单片机的内存通常分为多个区域,包括代码段、数据段(进一步细分为初始化数据段和未初始化数据段)、常量段等。这些区域分别用于存放程序代码、已初始化和未初始化的全局/静态变量以及常量数据。 #### 1. 全局变量与静态变量 全局变量和静态变量单片机存储于 **RAM** 的特定区域,具体位置由链接器配置决定。在程序启动时,初始化代码会将存储在 Flash 中的初始值复制到 RAM 的对应区域。 - 已初始化的全局变量和静态变量存放在 **data 段**,这部分数据在 Flash 中有对应的初始值,在程序运行前会被加载到 RAM 中[^2]。 - 未初始化的全局变量和静态变量存放在 **bss 段**,这部分数据在 Flash 中没有初始值,但在程序运行前会被初始化为零,并分配到 RAM 中[^3]。 #### 2. 局部变量 局部变量通常存储在 **栈区**,位于 RAM 中。局部变量的作用域仅限于定义它的函数或代码块内。当函数被调用时,局部变量会在栈上分配内存;函数返回后,栈上的这部分内存会被释放[^4]。 #### 3. 常量 常量数据(如字符串字面量或使用 `const` 关键字修饰的变量)通常存储在 **Flash** 的 **rodata 段** 中。这部分数据在程序运行期间不可修改,因此直接从 Flash 中读取以节省 RAM 空间[^5]。 #### 4. 动态分配的变量 通过 `malloc` 或类似函数动态分配的变量存储在 **堆区**,也位于 RAM 中。堆区的管理由程序员负责,需手动分配和释放内存。需要注意的是,许多小型单片机(如 STM32 或 MSP430)可能不支持标准库中的动态内存分配函数,因此需要谨慎使用[^1]。 #### 5. 特殊功能寄存器 (SFR) 某些变量可能直接映射到单片机的特殊功能寄存器 (SFR),例如 GPIO 状态寄存器或定时器控制寄存器。这些变量存储位置不由程序员显式定义,而是由硬件固定[^3]。 ```c // 示例:单片机变量存储方式 #include <stdio.h> int global_var = 10; // 存储在 data 段 static int static_var; // 存储在 bss 段 const char * const str = "Hello"; // 存储在 rodata 段 void func() { int local_var = 20; // 存储在栈区 } int main() { func(); return 0; } ``` ### 总结 单片机中的变量存储方式取决于其类型和作用域: - **全局变量和静态变量** 存储在 RAM 的 data 段或 bss 段。 - **局部变量** 存储在栈区。 - **常量** 存储在 Flash 的 rodata 段。 - **动态分配的变量** 存储在堆区。 - **特殊功能寄存器** 映射到特定的硬件地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值