---------------------------------------------
截至到目前為止,本人接觸微控制器也有將近一年的時間。這一年以來也接觸過了很具代表性的微控制器,比如51、ht32、stm32等等。但是呢對於微控制器的記憶體一直不了解,一直到現在,在一次微控制器程式設計時我用到了malloc函式為指標分配記憶體空間。不知道為什麼記憶體一直分配不成功。
所以這才去了解微控制器的記憶體。下圖是keli編譯成功後的輸出資訊。
在這裡,我們先只關心program size這一行:
code:**指令占用的空間;
ro-data:read only data的縮寫。它的意義是唯讀常量占用的空間,比如const型常量、字串常量等等;
rw-data:read write data的縮寫。它的意義是可讀可寫並且已初始化了的遍歷所占用的空間,比如全域性變數,靜 態變數等等;
zi-data:zero initialize data的縮寫。它的意義是以0初始化的變數,比如未初始化賦值的全域性變數、靜態變數等等;
而對微控制器燒寫程式時,flash被占用的空間大小為:code + ro data + rw data,但是程式執行時使用到的ram空間大小為:rw data + zi data。
falsh中被占用的空間 == **指令 + 唯讀資料值 + 已初始化變數的值。那麼為什麼程式執行時占用ram空間大小 == rw data + zi data呢?
我們都知道,在**執行機制上微控制器不同於pc,微控制器的程式通常是在falsh中直接取指執行,而pc是先把程式拷貝到ram中再取指執行。因此微控制器的ram中不會存在code拷貝(除非使用特殊方法強行使程式拷貝到了ram中執行)。另外微控制器ram中也不會存在ro-data拷貝,因為ro-data是唯讀資料,為了節省ram空間,這種資料在執行時直接從flash中取出使用,無需再複製到ram。又由於rw data和zi data是可讀可寫資料,為了供程式執行時正常讀寫,於是就會被放在微控制器的ram中(微控制器的flash區不能被程式改寫)
那麼對於區域性變數來說(rw data和zi data都是指的是全域性變數或者靜態變數),在c語言中全域性變數和靜態變數在ram中都有乙個特定的位址(存於靜態區),而區域性變數沒有特定的位址。因此區域性變數會被存放於堆疊中,當函式入棧時系統就會在棧頂開闢一段記憶體供區域性變數使用,函式出棧時該記憶體就會被釋放掉(靜態區域性變數除外)。
玩過pc的都知道,乙個程式在執行時它在記憶體中的占用情況是會隨時改變的,這其中可能有壓棧入棧和堆塊的申請與釋放等事件發生,那麼在微控制器裡難道就沒有這樣的過程了嗎?
其實微控制器的ram中也有堆疊區,因此程式執行時ram的使用量就不會再等於rw data + zi data了。(stm32的堆疊是存放於sram中的)而是等於 rw data + zi data + stack_size + heap_size;
另外編譯器並不會給變數乙個記憶體,而是在記憶體中為變數指定乙個位址,然後讓其他變數不會重複指向該位址。在編譯時編譯器會把變數名用位址替換掉,這樣也就達到了「編譯器給變數分配了記憶體」的效果。那麼,因為編譯器為每個變數分配位址且不會讓該位址被占用,由此可知rw data 和 zi data這兩塊資料在被分配好記憶體之後一直會處於無法被**的狀態。因此如果沒有新的程式燒錄至微控制器,rw data + zi data區占用的空間是不會變的。
而對於堆疊區,堆疊區的大小是由啟動檔案確定的。函式入棧、出棧的過程變化的只是區內的資料而不是堆疊區的大小(入棧數量超過了棧區的大小限制則為爆棧)。因此沒有新的程式燒錄至微控制器,堆疊區的大小也不會改變。
keil和微控制器
如何在keil上除錯程式,微控制器匯程式設計序的高效率,如何估計程式所用ram的大小。將系統移植到微控制器上需要考慮的諸多問題,如重入性,堆疊分配,外存使用,中斷操作等。比如串列埠操作,當多個任務需要使用串列埠時,需要各任務互斥使用串列埠傳送資料。各任務可以通過訊號量機制 互斥使用串列埠傳送接收緩衝...
微控制器 keil流水燈實驗
做流水燈實驗以前,必須先弄清楚各個發光二極體是怎麼控制的,其次,在了解了keil的內部左移右移函式,就可以寫出比較簡短的流水燈的實驗 在寫的過程中遇到過一些問題,怎麼控制燈的走向,應該用乙個怎麼樣的變數來實現傳遞,這個很重要。解決的方法是定義乙個unsigned char型變數。此外還要寫乙個延時函...
微控制器程式設計
1 data idata pdata和xdata的區別 2 微控制器中的位 bit 位元組 byte 字 word stc89c52 共有 512 位元組的 ram 是用來儲存資料的,比如我們定義的變數都是直接存在 ram 裡邊的。但是微控制器的這 512 位元組的 ram在地位上並不都是平等的,而...