字段說明:
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 站內 先做個文件用小黃鴨除錯法理一理資源約束與技術路線,如果開始沒有做好分割解耦設計,後面除錯是比較吃力的。最小系統法累加,或者逐個功能遮蔽,輔以多個變...