[單片機]你的程序到底有多大?

[單片機]你的程序到底有多大?


以前遇到一個問題,老師讓我給程序裏多加一個功能,我改好以後給單片機下載程序,這時候顯示文件大小超出範圍,超出部分已被自動截取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比較複雜,以後深刻研究以後再作補充。

相關文章
相關標籤/搜索