[思考]你的程序到底有多大?承认自己的缺点是进步的第一步

这是一个研究生期间印象比较深的事件,老师让我给程序里多加一个功能,我改好之后给单片机下载程序,这时候显示文件大小超出范围,超出部分已被自动截取

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

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

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

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

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

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

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


程序下载哪里?(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个量必须小于你的单片机的最大值,才能下载成功。

其实之前还有几次类似的事情,都是老师让我改一个bug或者添加一个功能,做好后老师问我我总是回答我也不知道,反正就这样改就好了,以前我一直没有承认自己不求甚解这个缺点,并且觉得这是快速完成任务的好方法,直到这次之后我真正承认这个却点后,我遇到问题的心态才有了明显改变,我都会下意识的问自己一句「为什么?」「凭什么?」,通常我们不是改正不了缺点,而是我们不愿意承认缺点,承认自己的缺点是进步的第一步,共勉。

关注微信公众号共同进步,同时欢迎加我的个人微信进行交流哦。

参考资料

[单片机ram和rom的区别]http://www.diangon.com/wenku/rd/danpianji/201505/00023829.html
[EEPROM和flash的区别]https://blog.csdn.net/times_poem/article/details/51423072
[EEPROM和flash的区别]https://blog.csdn.net/yuanlulu/article/details/6163106
[为什么单片机中既有Flash又有EEPROM]http://www.21ic.com/news/mcu/201612/697562.htm
[你写的单片机程序有多大,你知道吗?]https://www.toutiao.com/i6271187757104628225/?group_id=6271199375805481217&group_flags=0
[data xdata 和code]https://blog.csdn.net/qhdlaowang/article/details/56304401

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值