單片機的內存分配(變量的存儲位置)詳解


原文鏈接:https://blog.csdn.net/as480133937/article/details/87608816

單片機的內存分配(變量的存儲位置)詳解

對於初學者而言,對單片機的內存分配往往最讓人頭疼,很多人學了單片機幾年 都不知道單片機內部的內存使用情況是如何分配的。要了解 ROM(flash)、RAM(sram)啟動,首先 需要對 鏈接器 Linker 如何分配內存有一定的了解。

通常,對於棧生長方向向下的單片機,其內存一般模型是: 在這里插入圖片描述
在這里插入圖片描述
一個進程運行時,所占用的內存,可以分為如下幾個部分:
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

在這里插入圖片描述

在使用MDK編譯時可以看到
在這里插入圖片描述

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

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

RW-data 表示 已初始化的全局變量 = 棧區(stack)堆區(heap)全局區(靜態區)(static)

ZI-data 表示 未初始化的全局變量

部分參考自:http://blog.chinaunix.net/uid-15473693-id-388637.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM