flash 与CODE memory ,ROM与Xdata

本文介绍了单片机中Flash、ROM、RAM的区别以及实际应用。Flash作为程序存储器,可电擦写,寿命和容量各不相同;RAM用于存放运行过程数据,掉电后数据丢失;ROM则存储不变数据。代码示例探讨了char数组在不同定义下对RAM和Flash的占用情况,引发关于数据存储位置的疑问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、IAR环境会生产下面的map图

 112 416 bytes of CODE  memory                                          256falsh

      35 bytes of DATA  memory (+ 73 absolute )
   6 260 bytes of XDATA memory   8KRAM
     194 bytes of IDATA memory
       8 bits  of BIT   memory

     487 bytes of CONST memory

2、falsh与ROM ,RAM的区别

8K的flash是有8*1024个字节,一条指令可能有1~4个机器码,即1~4个字节,其中1~2机器码的指令使用最为频繁,所以这样算,大约可以写4000~8000条指令。一般的应用是写不到这么多的指令的。但是用于存储其他数据,例如汉字,数字点阵代码可能会超出预算。对于真的不够用的情况,建议楼主直接买块大容量的片。扩充flash不是很可取,增加了系统的不稳定因素,又提升了板的面积,布线难度。假如真的要扩容,可以有很多办法。扩展EEPROM(现常用256K~1M),或扩展基于SPI总线的flash memory(主流32M~128M),此两个总线驱动程序简单,方便扩展。

单片机FLASH主要用作程序存贮器,就是替代以前的ROM,最大的有有点是降低了芯片的成本并且可以做到电擦写,目前市场上单片机的FALSH寿命相差比较大,擦写次数从1000~1

### Keil Memory窗口中Data和Code的区别及用途 #### 1. **Code区** Code区通常用于存储程序指令,即CPU执行的操作码。这部分内存是只读的,在大多数嵌入式系统中由ROMFlash实现。 - **特点**: Code区的内容在编译时已经固定,无法在运行时修改。 - **功能**: 存储程序代码及其常量数据(如字符串字面量)。这些数据被称为RO-data(Read-Only data),它们不会改变并被放置在Code区内存中[^2]。 - **访问方式**: CPU通过取指操作从Code区加载指令到寄存器中执行。 例如,在Keil MDK中,`c:0`表示从地址0开始的Code区内容,开发者可以通过Memory Window观察该区域内存储的具体机器码[^1]。 ```c const char message[] = "Hello"; // 此字符串会被放入RO-data区域 ``` --- #### 2. **Data区** Data区主要用于存储可变的数据,分为多个子区域: - **DATA区**: - 数据位于内部RAM中,适合频繁访问的小型变量。 - 编译器自动初始化此区域内的全局/静态变量为预设值。 - 访问速度快,但由于容量有限,需谨慎使用。 - **IDATA区**: - 同样映射至内部RAM,但支持更大的寻址范围(最多可达256字节)。 - 需要额外的间接寻址指令来访问,因此速度稍慢于DATA区[^3]。 - **XDATA区**: - 对应外部扩展RAM,适用于大容量数据存储需求。 - 访问较慢,因为涉及多周期总线传输。 - **ZI-data区**: - ZI-data代表零初始化数据(Zero-initialized data),包括未显式赋初值的全局/静态变量以及栈和堆空间。 - 执行前由启动代码清零处理[^4]。 在Memory Window中,`d:0`, `i:0`, 和 `x:0`分别对应上述不同类型的Data区起点地址,允许用户实时监控其当前状态变化情况。 --- ### 总结对比表 | 特性 | Code区 | Data区 | |--------------|----------------------------------|-----------------------------------| | **位置** | ROM / Flash | RAM | | **内容** | 程序指令、常量 | 可变数据 | | **特性** | 不可更改 | 动态更新 | | **典型应用** | 函数体、字符串常量 | 局部变量、全局变量 | --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值