天天看點

詳解單片機的記憶體配置設定(看完茅塞頓開!)-道合順大資料infinigo

對于初學者而言,對單片機的記憶體配置設定往往最讓人頭疼,很多人學了單片機幾年都不知道單片機内部的記憶體使用情況是如何配置設定的。要了解 ROM(flash)、RAM(sram)啟動,首先 需要對連結器 Linker 如何配置設定記憶體有一定的了解。

通常,對于棧生長方向向下的單片機,其記憶體一般模型是:

詳解單片機的記憶體配置設定(看完茅塞頓開!)-道合順大資料infinigo

一個程序運作時,所占用的記憶體,可以分為如下幾個部分:

1、棧區(stack):由編譯器自動配置設定釋放,存放函數的參數值,局部變量的值等。

2、堆區(heap):一般由程式員配置設定釋放,若程式員不釋放,程式結束時可能由OS釋放。

3、全局變量、靜态變量:初始化的全局變量和靜态變量放在一塊區域,未初始化的全局變量和未初始化的靜态變量在相鄰的另一塊區域。程式結束後由系統自動釋放。

4、文字常量:常量字元串就是放在這裡的。這些資料是隻讀的,配置設定在RO-data(隻讀資料存儲區),則被包含在flash中,程式結束後由系統自動釋放

5、程式代碼(code):存放函數體的二進制代碼。

同時,單片機記憶體被分為flash(rom)和sram(ram),flash裡面的資料掉電可儲存,sram中的資料掉電就丢失,sram的執行速度要快于flash,flash容量大于sram。

上方的最低記憶體位址,最高位址,都是在flash和sram中

我們正常下載下傳程式都是下載下傳存儲進flash裡面,這也是為什麼斷電可儲存的原因。

單片機的程式存儲分為code(代碼存儲區)、RO-data(隻讀資料存儲區)、RW-data(讀寫資料存儲區) 和 ZI-data(零初始化資料區)

  • Flash 存儲 code和RO-data
  • Sram 存儲 RW-data 和ZI-data
詳解單片機的記憶體配置設定(看完茅塞頓開!)-道合順大資料infinigo

在使用MDK編譯時可以看到

詳解單片機的記憶體配置設定(看完茅塞頓開!)-道合順大資料infinigo

Code為程式代碼部分 = 程式代碼區(code)

RO-data 表示 程式定義的常量 = 文字常量區

繼續閱讀