微控制器程式MDK編譯大小說明及小建議

2021-08-19 07:00:43 字數 2183 閱讀 7057

字段說明:

code:即**域,它指的是編譯器生成的機器指令,這些內容被儲存到rom區。 

ro-data:read only data,即唯讀資料域,它指程式中用到的唯讀資料,這些資料被儲存在rom區,因而程式不能修改其內容。例如c語言中const關鍵字定義的變數就是典型的ro-data。  

rw-data:read write data,即可讀寫資料域,它指初始化為「非0值」的可讀寫資料,程式剛執行時,這些資料具有非0的初始值,且執行的時候它們會常駐在ram區,因而應用程式可以修改其內容。例如c語言中使用定義的全域性變數,且定義時賦予「非0值」給該變數進行初始化。  

zi-data:zero initialie data,即0初始化資料,它指初始化為「0值」的可讀寫資料域,它與rw-data的區別是程式剛執行時這些資料初始值全都為0,而後續執行過程與rw-data的性質一樣,它們也常駐在ram區,因而應用程式可以更改其內容。例如c語言中使用定義的全域性變數,且定義時賦予「0值」給該變數進行初始化(若定義該變數時沒有賦予初始值,編譯器會把它當zi-data來對待,初始化為0);  zi-data的棧空間(stack)及堆空間(heap):在c語言中,函式內部定義的區域性變數屬於棧空間,進入函式的時候從向棧空間申請記憶體給區域性變數,退出時釋放區域性變數,歸還記憶體空間。而使用malloc動態分配的變數屬於堆空間。在程式中的棧空間和堆空間都是屬於zi-data區域的,這些空間都會被初始值化為0值。編譯器給出的zi-data占用的空間值中包含了堆疊的大小(經實際測試,若程式中完全沒有使用malloc動態申請堆空間,編譯器會優化,不把堆空間計算在內)。

code+ro-data+zi-data:是在微控制器flash中占用的大小

rw-data+zi-data:是在微控制器ram中占用的大小

舉例1:

如:void test(int x,int y)

printf("x+y=%d\r\n",x+y);

這樣的**編譯後會放置到code段。

很多時候使用巨集,會增加code大小,需要注意。

舉例二:

unsigned char sendbuf[10]=;

因為是已經初始化的buf,所以這樣的**編譯會會放置到rw-data段。

舉例三:

在嵌入式開發過程中,我們經常用用到沒有字型檔的lcd或者數碼管,這時就需要自己設計字元表。字元表通常不會被更改,所以會被設定成唯讀屬性。如:

const unsigned char table=; //a~f

這樣的**編譯後會放置在ro-data段。

舉例四:

在驅動開發過程中,有時讀寫flash可能會開闢一塊全域性buf如:

unsigned char testbuf[1024]=; 

這樣的**編譯後會放置在zi-data段。

小建議建議一:數碼管、lcd字型檔設定為const比較保險,查表時比較穩定。

如果是c51微控制器可以試試code關鍵字,很有意思。

建議二 :全域性的buf不是越大越好,夠用就可以了。如果嵌入式系統模組較多,你開闢了很多buf,隨著開發進度的深入,你可能                會發現ram不夠用了,到時候再去擠bug,就很難找了。

建議三:除錯的log,用完後最好注釋掉,或者用帥氣的巨集開關遮蔽。因為這些log,一定占用了很多code段大小,所以如果                    flash小的話,要小心咯。

舉例:觀察以下兩個**段,請問哪種**段關閉log的方式比較好?

**段一:

#define log_print    mylogprint

void mylogprint(char * string)

printf(string);

int fputc(int ch, file *f)

**段二:

#define log_print    //mylogprint

void mylogprint(char * string)

printf(string);

int fputc(int ch, file *f)

我個人的理解,兩種方式都能達到關閉log的效果。

但是在log很多的時候,用**段二的方式,可以大大縮短實際編譯的韌體程式大小。我的一次親身經歷,是隨著專案的深入,**越來越多,後面發現flash快滿了,這時我採用**段二的方式關閉log,節省了將近40kcode段大小。也就是flash上可以再寫入40k的實際功能**。對於flash大小緊張的嵌入式晶元,40k的空間爽不爽?

小型微控制器系統延時關機程式及電路

設計思路很簡單 就是先按輕觸開關給系統供電,系統上電正常工作後通過乙個引腳控制乙個電子開關,代替輕觸開關為系統供電,在 微控制器程式設計時定義乙個變數,每次使用系統時清零該變數 沒有使用系統時利用微控制器的定時器自動累加此變數。到達一定值後該引腳輸出翻轉,控制電子開關關閉,系統自動斷電。相關電路如附...

51微控制器程式錯誤,無法編譯 怎麼搞好STC15F

include sbit p2 0 p2 0 sbit p2 1 p2 1 sbit p2 2 p2 2 sbit p2 3 p2 3 sbit p2 4 p2 4 sbit p2 5 p2 5 sbit p2 6 p2 6 sbit p2 7 p2 7 void delay while j whi...

微控制器及嵌入式系統驅動程式除錯方法

參考 question 段錯誤gdb定位不出來,除了加列印還有什麼別的除錯方式 發信站 水木社群 wed aug 21 04 18 31 2019 站內 先做個文件用小黃鴨除錯法理一理資源約束與技術路線,如果開始沒有做好分割解耦設計,後面除錯是比較吃力的。最小系統法累加,或者逐個功能遮蔽,輔以多個變...