flash 与CODE memory ,ROM与Xdata
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的空间
bcdef,肯定是存放在flash里面了.? 只是你同时又将这个字符串赋值给了数组str.? 等于说单片机内部有这么一个操作:? 实际存储:? code?str1x="abcdef"? 运行到main函数时:? char?str[]=str1x;
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |