單片機_rom_ram,程序容量之迷

目錄

引言

1.單片機中xdata 和data

2.單片機代碼code大小

3.附錄

(1)變量想放哪裏放哪裏大法

(2)函數一堆後綴

(3)__和不用__

(4)搜索小技巧


引言

單片機的內存有大小之分,內存大的相對較貴,如何選擇大小,是個頭疼問題,此文是自己在編程過程中遇到和ram,rom大小有關的問題。

1.單片機中xdata 和data

xdata是指片外的ram數據,data是指內部的ram數據。

而STC15中會有邏輯在外,實際在內的ram。如下圖:

                                                    圖1

上圖摘自stc15的手冊中,如果你的單片機ram只有128個字節,所以選擇Memory Model時乖乖選擇:Small。如下圖:

                                          圖2

因爲Large 模式,會選擇外部ram存放和讀取數據,你只有內部ram,所以程序會死(實踐中我的串口通訊失效)。

所以官方建議:

 Memory Model  : Specifies the C51 Compiler memory model. The default, SMALL, is a good choice for starting new applications.

每次開始新的應用,則需要重新選擇。

不同的model 生成的代碼是不同的

下面的圖是選用倆種不同的model ,編譯代碼的差異。

                                                                                        圖3

從上圖可得知,一個INC,硬生生多出了三條指令。使用了類似指針的操作。small model 速度快,生成的彙編代碼量小。(但是ram有限)

再來看看stc單片機的AUX ram ,存放xdata 的ram,STC15401AS系列如下圖

                                                                      圖4

他在內部做了一個aux ram<xdata>,用他手冊中的話是:邏輯在片外,物理上在片內的擴展RAM(8位地址)

stc單片機中有stc12 stc15 stc8,而接下來的一位數據時內存ram的大小,1代表128,2代表256,以此類推,所以只要你是4以後(大於256)就可以選擇lage model,再附上一張圖:

                                                                  圖5

4k的sram aux ram是3840

2.單片機代碼code大小

選用了一款stc15W204s單片機,2*128ram(sram) 和4k的rom(flash)。

開始編程,添加模塊uart.c,adc.c,timer.c.都還行,佔用code 800個字節,然後添加cs5460.c(電錶芯片的驅動程序),變成3991個字節了,我總共才4K,你還讓我不讓我玩了?

開始查詢map文件,查詢code,到底是哪個鬼?

                                                               圖6

上圖中,左側第一列是程序容量大小(16進制),第二列是十進制的code容量大小,上圖可知一個lib_code 佔用我1487個字節,在加函數ftoa(514),和ITof(381),就2K了,lib_code 是??繼續查找MAP前面的input modules included內容,對比後如下

                                                                                                     圖7

上圖左側是有ftoa(514),和ITof(381)倆個函數編譯後的結果,右側是沒有ftoa(514),和ITof(381)倆個函數的編譯結果。

這倆個費勁函數裏面使用浮點數計算,然後就加了一堆庫函數,如C51FPL(?C?FPADD)......and so    on。

下圖是上圖中的各種lib文件的說明(此處雖然是stc15w204s,但我把memory model 修改爲了large ,所以它用了C51L.lib)

                                                                               圖8

上圖可看出,使用不同的memory model會調用不同的庫函數

圖6中還有一堆?C?這個的意思如下圖:

翻譯一下就是:每個段名都有一個前綴,對應於用於該段的內存類型。前綴用問號(?)括起來。

原先一度以爲是亂碼,來倆個??問號。自以爲是,自認玄學的態度得改。

問題來了?我的是4K單片機,而code rom size 只有2K 和64 k的選擇,如下圖:

那麼我4K的單片機,在編譯器裏面能幹到64K,可實際下載的時候,就塞不進去了,不知道有啥方法,限制一下??

以上內容參考來自:

(1)stc15.pdf

(2)keil中的uvison help  下的C51 development Tools ,

3.附錄

再搬運幾張C51 development Tools 的圖(我是搬運工)

(1)變量想放哪裏放哪裏大法

爲了與以前版本的C51編譯器兼容,可以在數據類型之前指定內存區域。例如,以下兩個聲明是等效的:

在加一個at關鍵字,想藏那個犄角旮旯,就去哪裏。

(2)函數一堆後綴

比如

使用小內存模型的函數的優點是局部變量和函數形參存儲在內部8051ram中。

因此,數據訪問非常高效。內存有限。有時,小模型不能滿足非常大程序的要求,必須使用其他內存模型。

對於這種情況,可以聲明函數使用不同的內存模型,如上圖所示。

(3)__和不用__

慣例規定,對於系統頭文件,宏名以“__”開頭,而對於用戶頭文件,宏名不應以“__”開頭。宏名應包含頭文件名和一些附加文本。

(4)搜索小技巧

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