[思考]你的程序到底有多大?承認自己的缺點是進步的第一步

這是一個研究生期間印象比較深的事件,老師讓我給程序裏多加一個功能,我改好之後給單片機下載程序,這時候顯示文件大小超出範圍,超出部分已被自動截取

我看了一下編譯生成的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章