[单片机]你的程序到底有多大?

[单片机]你的程序到底有多大?


以前遇到一个问题,老师让我给程序里多加一个功能,我改好以后给单片机下载程序,这时候显示文件大小超出范围,超出部分已被自动截取html

我看了一下编译生成的Hex文件 47KB函数

而后打开说明书,找到单片机的型号STC15F2K16S2,看了一下他的EEPROM,嗯45KB因此放不下。spa

而后我把添加的功能去掉,再看一眼,我去原来就是46KB,为啥能下进去呀?.net

管他呢,因而我给老师说:老师单片机只能下45K的程序,加上功能后47K下不了,去掉功能呢是46K勉强能下进去 (嗯,勉强能下进去,很强势,因此程序能够硬塞进去是吧,你觉得是公交车?)code

直到今天,老师问我你有空没?我跟你说个事。
你上次跟我说程序下不进去,是由于HEX文件超过45K了,我打电话给STC的工程师了,他说跟哪一个不要紧,不要看HEX的大小,要看BIN的大小,这就是KEIL里这个code=16412,应为我们的单片机Flash是16K==16384B,因此只要这个code超过16384就下不进去了htm

不加功能code=16357,因此能下,不是你说的勉强能塞进去,程序这东西,一点也不能勉强。blog

确实自从本科上完单片机课后,我就再没有试图去了解单片机,虽然一直会用一些单片机,但那仅仅是会用的入门水平,连熟练都谈不上。这也是我一直以来都有的坏习惯,感兴趣的东西能够迅速掌握到会用水平,以后缺少深刻研究的耐心,而后逐渐失去兴趣。 貌似什么都了解一些,却没同样能算的上精通。反思以后我i马上去查资料仍是颇有收获的。资源


程序下载哪里?(ROM-flash)

ROM是只读存储器,CPU只能从里面读数据,而不能往里面写数据,掉电后数据依然保存在存储器中;RAM是随机存储器,CPU既能够从里面读出数据,又能够往里面写入数据,掉电后数据不保存。由于程序掉电后还在全部只能放在ROM里rem

RAM和ROM

ROM

程序通过编译、汇编、连接后,生成hex文件。用专用的烧录软件,经过烧录器将hex文件烧录到ROM中,ROM中包含全部的程序内容:不管是一行一行的程序代码,函数中用到的局部变量,头文件中所声明的全局变量,const声明的只读常量,都被生成了二进制数据,包含在hex文件中,所有烧录到了ROM里面,此时的ROM,包含了程序的全部信息,正是因为这些信息,“指导”了CPU的全部动做。get

ROM包括FLASH和EEPROM

EEPROM是用来保存用户数据,运行过程当中能够改变,好比一个时钟的闹铃时间初始化设定为12:00,后来在运行中改成6:00,这是保存在EEPROM里,不怕掉电,就算从新上电也不须要从新调整到6:00。

Flash属于广义的EEPROM,由于它也是电擦除的ROM。可是为了区别于通常的按字节为单位的擦写的EEPROM,咱们都叫它Flash单片机里的Flash都用于存放运行代码,在运行过程当中不能改;

RAM

程序一旦开始运行,会有不少变量的值是不断变化的,这些中间变量存储在RAM中

*结论:在单片机中,RAM主要是作运行时数据存储器,FLASH主要是程序存储器,EEPROM主要是用以在程序运行保存一些须要掉电不丢失的数据。

data xdata 和code

data占用ram空间,xdata占用ram空间,code占用flash空间(若是变量定义在这个空间,后面就不能修改了,若是有语句改变它的值,编译器就会报错。)
以STC89C52RC为例,其中RAM资源的256字节,其中内部128字节,外部扩展128字节。那么这个内部128字节,对应的就是data定义的变量,外部的128字节对应的就是xdata定义的变量。

结论:你的程序到底有多大,须要你看编译后data、xdata、和code的大小,这3个量必须小于你的单片机的最大值,才能下载成功。

参考资料

[单片机ram和rom的区别] http://www.diangon.com/wenku/...
[EEPROM和flash的区别] https://blog.csdn.net/times_p...
[EEPROM和flash的区别] https://blog.csdn.net/yuanlul...
[为何单片机中既有Flash又有EEPROM] http://www.21ic.com/news/mcu/...
[你写的单片机程序有多大,你知道吗?] https://www.toutiao.com/i6271...
[data xdata 和code] https://blog.csdn.net/qhdlaow...

这是目前查的资料,有了必定的了解,RAM比较复杂,以后深刻研究以后再作补充。

相关文章
相关标签/搜索