分享

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

 昵称28372044 2018-06-10

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

我看了一下编译生成的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或者添加一个功能,做好后老师问我我总是回答我也不知道,反正就这样改就好了,以前我一直没有承认自己不求甚解这个缺点,并且觉得这是快速完成任务的好方法,直到这次之后我真正承认这个却点后,我遇到问题的心态才有了明显改变,我都会下意识的问自己一句「为什么?」「凭什么?」。

通常我们不是改正不了缺点,而是我们不愿意承认缺点,承认自己的缺点是进步的第一步,共勉。

共同进步,与君共勉

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多