日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于STM32分析栈、堆、全局区、常量区、代码区、RAM、ROM

發(fā)布時(shí)間:2025/4/16 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于STM32分析栈、堆、全局区、常量区、代码区、RAM、ROM 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

總體介紹

棧區(qū)(stack)

堆區(qū)(heap)

全局區(qū)(靜態(tài)區(qū))

.bss段

.data段

常量區(qū)

代碼區(qū)

RAM和ROM、Flash Memory的物理特性

RAM

ROM

Flash Memory

不同數(shù)據(jù)的存放位置

Keil 的Build Output窗口


總體介紹

在一個(gè)STM32程序代碼中,從內(nèi)存高地址到內(nèi)存低地址,依次分布著棧區(qū)、堆區(qū)、全局區(qū)(靜態(tài)區(qū))、常量去、代碼區(qū),其中全局區(qū)中高地址分布著.bss段,低地址分布著.data段。總的分布如下圖所示

內(nèi)存高地址棧區(qū)
?堆區(qū)
.bss段
.data段
常量區(qū)
內(nèi)存低地址代碼區(qū)

下面分別對(duì)每一個(gè)區(qū)做詳細(xì)的介紹。

棧區(qū)(stack)

  • 臨時(shí)創(chuàng)建的局部變量存放在棧區(qū)。
  • 函數(shù)調(diào)用時(shí),其入口參數(shù)存放在棧區(qū)。
  • 函數(shù)返回時(shí),其返回值存放在棧區(qū)。
  • const定義的局部變量存放在棧區(qū)。

堆區(qū)(heap)

  • 堆區(qū)用于存放程序運(yùn)行中被動(dòng)態(tài)分布的內(nèi)存段,可增可減。
  • 可以有malloc等函數(shù)實(shí)現(xiàn)動(dòng)態(tài)分布內(nèi)存。
  • 有malloc函數(shù)分布的內(nèi)存,必須用free進(jìn)行內(nèi)存釋放,否則會(huì)造成內(nèi)存泄漏。

全局區(qū)(靜態(tài)區(qū))

全局區(qū)有.bss段和.data段組成,可讀可寫(xiě)。

.bss段

  • 未初始化的全局變量存放在.bss段。
  • 初始化為0的全局變量和初始化為0的靜態(tài)變量存放在.bss段。
  • .bss段不占用可執(zhí)行文件空間,其內(nèi)容有操作系統(tǒng)初始化。

.data段

  • 已經(jīng)初始化的全局變量存放在.data段。
  • 靜態(tài)變量存放在.data段。
  • .data段占用可執(zhí)行文件空間,其內(nèi)容有程序初始化。
  • const定義的全局變量存放在.rodata段。

常量區(qū)

  • 字符串存放在常量區(qū)。
  • 常量區(qū)的內(nèi)容不可以被修改。

代碼區(qū)

  • 程序執(zhí)行代碼存放在代碼區(qū)。
  • 字符串常量也有可能存放在代碼區(qū)。

通過(guò)上面的介紹,可能你對(duì)各個(gè)數(shù)據(jù)的存儲(chǔ)位置還是很模糊,下面通過(guò)一個(gè)簡(jiǎn)單的程序,再來(lái)體會(huì)理解一下。

#include <stdio.h>static unsigned int val1 = 1; //val1存放在.data段unsigned int val2 = 1; //初始化的全局變量存放在.data段unsigned int val3 ; //未初始化的全局變量存放在.bss段const unsigned int val4 = 1; ?//val4存放在.rodata(只讀數(shù)據(jù)段)unsigned char Demo(unsigned int num) // num 存放在棧區(qū) {char var = "123456"; // var存放在棧區(qū),"123456"存放在常量區(qū)unsigned int num1 = 1 ; // num1存放在棧區(qū)static unsigned int num2 = 0; // num2存放在.data段const unsigned int num3 = 7; ?//num3存放在棧區(qū)void *p;p = malloc(8); //p存放在堆區(qū)free(p);return 1; }void main() {unsigned int num = 0 ;num = Demo(num); //Demo()函數(shù)的返回值存放在棧區(qū)。 }

上面我們已經(jīng)對(duì)堆、棧、全局區(qū)、常量區(qū)、代碼區(qū)進(jìn)行了全面的分析,也舉例進(jìn)行了說(shuō)明。下面我們?cè)趯?duì)這些區(qū)存放在哪種介質(zhì)上進(jìn)行討論。

RAM和ROM、Flash Memory的物理特性

首先,我們需要明白R(shí)AM和ROM、Flash Memory的物理特性。

RAM

RAM又稱隨機(jī)存取存儲(chǔ)器,存儲(chǔ)的內(nèi)容可通過(guò)指令隨機(jī)讀寫(xiě)訪問(wèn)。RAM中的存儲(chǔ)的數(shù)據(jù)在掉電是是會(huì)丟失,因而只能在開(kāi)機(jī)運(yùn)行時(shí)存儲(chǔ)數(shù)據(jù)。其中RAM又可以分為兩種,一種是Dynamic RAM(DRAM動(dòng)態(tài)隨機(jī)存儲(chǔ)器),另一種是Static RAM(SRAM,靜態(tài)隨機(jī)存儲(chǔ)器)。

ROM

ROM又稱只讀存儲(chǔ)器,只能從里面讀出數(shù)據(jù)而不能任意寫(xiě)入數(shù)據(jù)。ROM與RAM相比,具有價(jià)格高,容量小的缺點(diǎn)。但由于其具有掉電后數(shù)據(jù)可保持不變的優(yōu)點(diǎn),因此常用也存放一次性寫(xiě)入的程序和數(shù)據(jù),比如主版的BIOS程序的芯片就是ROM存儲(chǔ)器。

Flash Memory

由于ROM具有不易更改的特性,后面就發(fā)展了Flash Memory。Flash Memory不僅具有ROM掉電不丟失數(shù)據(jù)的特點(diǎn),又可以在需要的時(shí)候?qū)?shù)據(jù)進(jìn)行更改,不過(guò)價(jià)格比ROM要高。

不同數(shù)據(jù)的存放位置

由前面的分析我們知道,代碼區(qū)和常量區(qū)的內(nèi)容是不允許被修改的,ROM(STM32就是Flash Memory)也是不允許被修改的,所以代碼區(qū)和常量區(qū)的內(nèi)容編譯后存儲(chǔ)在ROM中。

而棧、堆、全局區(qū)(.bss段、.data段)都是存放在RAM中。

至此,關(guān)于不同數(shù)據(jù)存放哪個(gè)區(qū)域已經(jīng)全部介紹完了。下面還將介紹一下Keil 的Build Output窗口。

Keil 的Build Output窗口

如上圖,存在Code、RO-data、RW-data、ZI-data四個(gè)代碼段大小。

其中Code就是代碼占用大小,RO-data是只讀常量、RW-data是已初始化的可讀可寫(xiě)變量,ZI-data是未初始化的可讀可寫(xiě)變量。

有些時(shí)候,我們需要知道RAM和ROM的使用情況如何,那么我們就可以使用下面的公式計(jì)算。

RAM? = RW-data + ZI-data

ROM?= Code + RO-data + RW-data?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的基于STM32分析栈、堆、全局区、常量区、代码区、RAM、ROM的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。