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


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

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

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

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

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

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

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

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


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

ROM是只读存储器,CPU只能从里面读数据,而不能往里面写数据,掉电后数据依然保存在存储器中;RAM是随机存储器,CPU既可以从里面读出数据,又可以往里面写入数据,掉电后数据不保存。因为程序掉电后还在所有只能放在ROM里

RAM和ROM

ROM

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

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比较复杂,之后深入研究之后再做补充。


zinghd
65 声望9 粉丝

阻止你前进的不是那些你不会的,而是那些一知半解的。