博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
flash 与CODE memory ,ROM与Xdata
阅读量:4297 次
发布时间:2019-05-27

本文共 1875 字,大约阅读时间需要 6 分钟。

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~10万的都有,但存储时间可以保证40年,在选用时要注意.还有一些廉价的单片机为了集成可掉电的数据存储器,没有选用价格昂贵的EEPROM,而用FALSH来做的,但要注意其寿命最多就10万次,而且擦写不能字节擦写,这要注意使用的场合其寿命是否满足要求.

RAM是数据存储器,跟计算机里面的内存差不多,主要是用来存放程序运行中的过程数据,掉电后就会丢失之前的数据,所以程序在上电时需要进行初始化,否则上电后的数据是一个随机数,可能导致程序奔溃.

ROM就是程序存储器,掉电后数据不会丢失,但在程序运行过程中其数据不会改变.早期的单片机的ROM因为擦写修改麻烦,价格昂贵或者价格低廉的OTP型无法修改数据等原因已经被现在的FLASH存储器替代了.因为FLASH的擦写很容易,现在的部分单片机支持在线内部编程,通过特定的程序执行方式可以修改FALSH的内容,而实现在线修改程序存储器.这与上面说的程序存储器的内容在运行的时候不可被改变是不冲突的,因为在程序正常运行时,其内容不会改变,只工作在只读状态下的.

3、实际代码中的应用

先给出一段代码:

#include <reg51.h>

#include "uart.h"

 void main()

{

    char []str="abcdef";

    UartInit();

    while(1)

    {

        PrintString(str);

        Delayms(500);

    }

}

这样,这个测试程序可以一直通过串口打印字符串“abcdef”。

问题1:定义的char []str字符数组占用了单片机的RAM,是否同时占用单片机的Flash程序空间?

问题2:如果在字符数组定义时加上“code”关键词,即定义成 char code []str ="abcdef";是不是只占用单片机的Flash程序空间?

请各位大神指教,先谢谢了。。

如果说 char []str ="abcdef"定义后只占用RAM;char code []str="abcdef";定义后只占用Flash,

那为什么char []str ="abcdef"这样定义的程序编译下载到单片机后能打印出“abcdef”呢,断电后重启也能打印出来,这个字符不是保存在RAM空间么?很疑惑。

HI,你好,如果定义,char []str 在程序编译的时候就分配了RAM空间,这个空间在整个MAIN函数里面都有效。 
对于问题2,是只占用了FLASH的空间
谢谢这位朋友的解答。我的疑问点还有一个:就是说这个程序编译后生成HEX,下载到单片机,定义的char str[]="abcdef";是存在于所分配的RAM空间,而不会占用Flash空间,那我让单片机断电重启,串口还是能打印“abcdef”这样的字符串,那这个要怎么解释呢?主要是这一点我很迷糊

bcdef,肯定是存放在flash里面了. 
只是你同时又将这个字符串赋值给了数组str. 
等于说单片机内部有这么一个操作: 
实际存储: 
code str1x="abcdef" 
运行到main函数时: 
char str[]=str1x;

转载地址:http://nmbws.baihongyu.com/

你可能感兴趣的文章
json,map与list简单理解
查看>>
数据库关系设计简单理解
查看>>
线程池和数据库连接池的原理与使用
查看>>
行测找规律方法汇总
查看>>
【通俗易懂】springboot前后台传值的总结
查看>>
mySQL 资料备份---
查看>>
Qt开发经验总结之武林秘籍(转)
查看>>
Swift5 vs C/C++ (未完待续)
查看>>
SDK开发(未完待续)
查看>>
公式集合(未完待续)
查看>>
文章索引~人工智能
查看>>
Qt常用代码段收集---未完待续
查看>>
Qt5.12.7 MinGW X64连接MySQL5.7.28 X64
查看>>
程序员 业余赚钱的六种途径(转)
查看>>
Web开发(未完待续)
查看>>
文章索引-Android
查看>>
USB相机调试经历(Windows)
查看>>
“_ConnectionPtr”: 未声明的标识符。
查看>>
文章索引~ Visual C++
查看>>
tr1::shared_ptr 代码范例
查看>>