0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺談C語(yǔ)言內(nèi)存分區(qū)和STM32存儲(chǔ)器分配

技術(shù)讓夢(mèng)想更偉大 ? 來(lái)源:技術(shù)讓夢(mèng)想更偉大 ? 2024-04-02 09:50 ? 次閱讀

一、C語(yǔ)言內(nèi)存分區(qū)

C語(yǔ)言內(nèi)存分區(qū)示意圖如下:

b9cbd4b6-f03b-11ee-a297-92fbcf53809c.png

1. 棧區(qū)

棧區(qū)介紹

棧區(qū)由編譯器自動(dòng)分配釋放,由操作系統(tǒng)自動(dòng)管理,無(wú)須手動(dòng)管理。

棧區(qū)上的內(nèi)容只在函數(shù)范圍內(nèi)存在,當(dāng)函數(shù)運(yùn)行結(jié)束,這些內(nèi)容也會(huì)自動(dòng)被銷毀。

棧區(qū)按內(nèi)存地址由高到低方向生長(zhǎng),其最大大小由編譯時(shí)確定,速度快,但自由性差,最大空間不大。

棧區(qū)是先進(jìn)后出原則,即先進(jìn)去的被堵在屋里的最里面,后進(jìn)去的在門口,釋放的時(shí)候門口的先出去。

存放內(nèi)容

臨時(shí)創(chuàng)建的局部變量和const定義的局部變量存放在棧區(qū)。

函數(shù)調(diào)用和返回時(shí),其入口參數(shù)和返回值存放在棧區(qū)。

2. 堆區(qū)

堆區(qū)介紹

堆區(qū)由程序員分配內(nèi)存和釋放。

堆區(qū)按內(nèi)存地址由低到高方向生長(zhǎng),其大小由系統(tǒng)內(nèi)存/虛擬內(nèi)存上限決定,速度較慢,但自由性大,可用空間大。

調(diào)用函數(shù)

用malloc等函數(shù)實(shí)現(xiàn)動(dòng)態(tài)分布內(nèi)存。

void *malloc(size_t);

參數(shù)size_t是分配的字節(jié)大小。
返回值是一個(gè)void*型的指針,該指針指向分配空間的首地址。
(void *型指針可以任意轉(zhuǎn)換為其他類型的指針)

用free函數(shù)進(jìn)行內(nèi)存釋放,否則會(huì)造成內(nèi)存泄漏。

void free(void * /*ptr*/);

參數(shù)是開辟的內(nèi)存的首地址。

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

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

通常是用于那些在編譯期間就能確定存儲(chǔ)大小的變量的存儲(chǔ)區(qū),但它用于的是在整個(gè)程序運(yùn)行期間都可見的全局變量和靜態(tài)變量。

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

.bss段

未初始化的全局變量和未初始化的靜態(tài)變量存放在.bss段。

初始化為0的全局變量和初始化為0的靜態(tài)變量存放在.bss段。

.bss段不占用可執(zhí)行文件空間,其內(nèi)容由操作系統(tǒng)初始化。

.data段

已初始化的全局變量存放在.data段。

已初始化的靜態(tài)變量存放在.data段。

.data段占用可執(zhí)行文件空間,其內(nèi)容有程序初始化。

4. 常量區(qū)

字符串、數(shù)字等常量存放在常量區(qū)。

const修飾的全局變量存放在常量區(qū)。

程序運(yùn)行期間,常量區(qū)的內(nèi)容不可以被修改。

5. 代碼區(qū)

程序執(zhí)行代碼存放在代碼區(qū),其值不能修改(若修改則會(huì)出現(xiàn)錯(cuò)誤)。

字符串常量和define定義的常量也有可能存放在代碼區(qū)。

二、STM32存儲(chǔ)器分配

1. 隨機(jī)存儲(chǔ)器—RAM

RAM是與CPU直接交換數(shù)據(jù)的內(nèi)部存儲(chǔ)器,也叫主存(內(nèi)存)。

它可以隨時(shí)讀寫,而且速度很快,通常作為操作系統(tǒng)或其他正在運(yùn)行中的程序的臨時(shí)數(shù)據(jù)存儲(chǔ)媒介。

當(dāng)電源關(guān)閉時(shí)RAM不能保留數(shù)據(jù)(掉電數(shù)據(jù)消失哦)如果需要保存數(shù)據(jù),就必須把它們寫入一個(gè)長(zhǎng)期的存儲(chǔ)設(shè)備中(例如硬盤)。

2. 只讀存儲(chǔ)器—ROM

ROM所存數(shù)據(jù),一般是裝入整機(jī)前事先寫好的,整機(jī)工作過(guò)程中只能讀出,而不像隨機(jī)存儲(chǔ)器那樣能快速地、方便地加以改寫。

ROM所存數(shù)據(jù)穩(wěn)定,斷電后所存數(shù)據(jù)也不會(huì)改變。

本文使用是STM32F103芯片,keil V5環(huán)境下默認(rèn)的內(nèi)存配置見下圖:

b9d0b364-f03b-11ee-a297-92fbcf53809c.png

ROM區(qū)域是0x8000000開始,大小是0x10000,這片區(qū)域是只讀區(qū)域,不可修改,存放代碼區(qū)和常量區(qū)。

RAM區(qū)域是0x20000000開始,大小是0x5000,這片區(qū)域是可讀寫區(qū)域,存放的是全局(靜態(tài))區(qū)、堆區(qū)和棧區(qū)。

該芯片的內(nèi)部分區(qū)如下圖所示:

b9e701e6-f03b-11ee-a297-92fbcf53809c.png

三、基于STM32代碼驗(yàn)證

1. 詳細(xì)代碼如下

#include "main.h"
#include  //用于字符串處理
#include //用于printf打印
#include  //用于分配堆區(qū)---調(diào)用malloc和free

#include "delay.h"
#include "uart3.h"
#include "led.h"

//全局區(qū)
int q1;//未初始化全局變量
static int q2;//未初始化靜態(tài)變量
const  int   q3;//未初始化只讀變量

int   m1=1;//已初始化全局變量
static  int   m2=2;//已初始化靜態(tài)變量

//常量區(qū)
const   int   m3=3;//已初始化只讀變量

int main(void)
{
SystemCoreClockUpdate(); //設(shè)置系統(tǒng)時(shí)鐘為72M
LED_GPIO_Config();
Uart3_init();

while(1)
{
//棧區(qū)
int  mq1;//未初始化局部變量
int  *mq2;//未初始化局部指針變量

int   mq3=3;//已初始化局部變量
char qq[10] = "hello"; //已初始化局部數(shù)組

const  int   mq4;//未初始化局部只讀變量
const   int   mq5=3;//已初始化局部只讀變量

//堆區(qū)
int *p1 = malloc(4);    //已初始化局部指針變量p1
int *p2 = malloc(4);    //已初始化局部指針變量p2

//全局區(qū)
static int mp1;//未初始化局部靜態(tài)變量
static  int   mp2=2;//已初始化局部靜態(tài)變量

//常量區(qū)
char *vv = "I LOVE YOU";//已初始化局部指針變量
char *mq = "5201314";

printf("
棧區(qū)-變量地址
");
printf("未初始化局部變量 :0x%p
",&mq1);
printf("未初始化局部指針變量:0x%p
",&mq2);
printf("已初始化局部變量:0x%p
",&mq3);
printf("已初始化局部數(shù)組:0x%p
", qq );

printf("未初始化局部只讀變量 :0x%p
",&mq4);
printf("已初始化局部只讀變量:0x%p
",&mq5);

printf("
堆區(qū)-動(dòng)態(tài)申請(qǐng)地址
");
printf("已初始化局部int型指針變量p1   :0x%p
", p1);
printf("已初始化局部int型指針變量p2   :0x%p
", p2);

printf("
全局區(qū)-變量地址
");
printf("未初始化全局變量 :0x%p
",&q1);
printf("未初始化靜態(tài)變量:0x%p
",&q2);
printf("未初始化只讀變量:0x%p
",&q3);

printf("已初始化全局變量 :0x%p
",&m1);
printf("已初始化靜態(tài)變量:0x%p
",&m2);

printf("未初始化局部靜態(tài)變量 :0x%p
",&mp1);
printf("已初始化局部靜態(tài)變量 :0x%p
",&mp2);

printf("
常量區(qū)地址
");
printf("已初始化只讀變量  :0x%p
",&m3);
printf("已初始化局部指針變量  :0x%p
",vv );
printf("已初始化局部指針變量  :0x%p
",mq );

printf("
代碼區(qū)地址
");
printf("程序代碼區(qū)main函數(shù)入口地址:0x%p
", main);

led485_flicker();
delay_ms(1000);

free(p1);
free(p2);        
}
}
審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7366

    瀏覽量

    163095
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10702

    瀏覽量

    209382
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2903

    瀏覽量

    73541
  • STM32
    +關(guān)注

    關(guān)注

    2258

    文章

    10828

    瀏覽量

    352497
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134101

原文標(biāo)題:1. 詳細(xì)代碼如下

文章出處:【微信號(hào):技術(shù)讓夢(mèng)想更偉大,微信公眾號(hào):技術(shù)讓夢(mèng)想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是Bootloader 淺談STM32中bootloader的內(nèi)存分配

    。Bootloader不但依賴于CPU的體系架構(gòu),而且依賴于嵌入式系統(tǒng)板級(jí)設(shè)備的配置。 3. STM32中bootloader的內(nèi)存分配
    的頭像 發(fā)表于 02-15 06:10 ?1.7w次閱讀
    什么是Bootloader <b class='flag-5'>淺談</b><b class='flag-5'>STM32</b>中bootloader的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    C語(yǔ)言知識(shí)總結(jié):動(dòng)態(tài)內(nèi)存分配

    動(dòng)態(tài)內(nèi)存分配就 是指在程序執(zhí)行的過(guò)程中動(dòng)態(tài)地分配或者回收存儲(chǔ)空間的分配內(nèi)存的方法。動(dòng)態(tài)
    發(fā)表于 10-24 15:52 ?774次閱讀

    C語(yǔ)言既然可以自動(dòng)為變量分配內(nèi)存,為什么還要用動(dòng)態(tài)分配內(nèi)存呢?

    不知道大家在學(xué)習(xí)C語(yǔ)言動(dòng)態(tài)分配內(nèi)存的時(shí)候有沒(méi)有過(guò)這樣的疑問(wèn),既然系統(tǒng)可以自動(dòng)幫我們分配內(nèi)存,為什
    發(fā)表于 12-13 11:14 ?917次閱讀

    C語(yǔ)言程序設(shè)計(jì)中動(dòng)態(tài)內(nèi)存分配如何實(shí)現(xiàn)

    C語(yǔ)言程序設(shè)計(jì)中,動(dòng)態(tài)內(nèi)存分配如何實(shí)現(xiàn),需要注意哪些問(wèn)題?
    發(fā)表于 09-28 16:53 ?1142次閱讀

    應(yīng)大家要求詳細(xì)講解下C語(yǔ)言內(nèi)存分配-通俗理解

    最近很多同學(xué)希望了解C語(yǔ)言內(nèi)存分配,雖然可以在互聯(lián)網(wǎng)上找到諸多的講解,但是你會(huì)發(fā)現(xiàn)要么不通俗易懂,要么不算太全面。而這些對(duì)于新手而言,又絕對(duì)會(huì)把你弄得暈頭轉(zhuǎn)向的,所以在此對(duì)網(wǎng)上和書本
    發(fā)表于 10-08 14:13

    C語(yǔ)言內(nèi)存分配-通俗理解

    最近很多同學(xué)希望了解C語(yǔ)言內(nèi)存分配,雖然可以在互聯(lián)網(wǎng)上找到諸多的講解,但是你會(huì)發(fā)現(xiàn)要么不通俗易懂,要么不算太全面。而這些對(duì)于新手而言,又絕對(duì)會(huì)把你弄得暈頭轉(zhuǎn)向的,所以在此對(duì)網(wǎng)上和書本
    發(fā)表于 10-08 14:57

    STM32存儲(chǔ)器映像

    與時(shí)鐘概述3.2.6.STM32的時(shí)鐘框圖詳解第二部分、章節(jié)介紹3.2.1.STM32存儲(chǔ)器映像 本節(jié)講述STM32存儲(chǔ)器映像,涉及到了
    發(fā)表于 08-20 06:06

    CPU對(duì)存儲(chǔ)器的讀寫

    匯編語(yǔ)言程序目錄一、CPU對(duì)存儲(chǔ)器的讀寫二、內(nèi)存地址空間三、將各類存儲(chǔ)器看作一個(gè)邏輯器件——統(tǒng)一編址四、內(nèi)存地址空間的
    發(fā)表于 12-10 08:04

    存儲(chǔ)器映射與寄存映射的原理分別是什么

    一定編碼規(guī)則分配地址的行為。值得注意,存儲(chǔ)器映射一般是由產(chǎn)家規(guī)定,用戶不能隨意更改。圖2 STM32芯片存儲(chǔ)器映射注1STM32中,I-Co
    發(fā)表于 12-20 08:17

    內(nèi)存儲(chǔ)器的分類

    內(nèi)存儲(chǔ)器包括寄存、高速緩沖存儲(chǔ)器(Cache)和主存儲(chǔ)器。寄存在CPU芯片的內(nèi)部,高速緩沖存儲(chǔ)器
    的頭像 發(fā)表于 01-07 16:54 ?3.4w次閱讀

    存儲(chǔ)器分區(qū)內(nèi)存管理與分區(qū)存儲(chǔ)管理

    內(nèi)存固定地劃分為若干個(gè)大小不等的分區(qū)供各個(gè)程序使用,每個(gè)分區(qū)的大小和位置都固定,系統(tǒng)運(yùn)行期間不再重新劃分。
    發(fā)表于 05-26 10:28 ?3023次閱讀
    <b class='flag-5'>存儲(chǔ)器</b>的<b class='flag-5'>分區(qū)內(nèi)存</b>管理與<b class='flag-5'>分區(qū)</b><b class='flag-5'>存儲(chǔ)</b>管理

    EE-62:用C語(yǔ)言訪問(wèn)短字存儲(chǔ)器

    EE-62:用C語(yǔ)言訪問(wèn)短字存儲(chǔ)器
    發(fā)表于 04-19 11:58 ?0次下載
    EE-62:用<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>訪問(wèn)短字<b class='flag-5'>存儲(chǔ)器</b>

    C語(yǔ)言程序編譯后內(nèi)存地址的分配

    本文目的是簡(jiǎn)要介紹C語(yǔ)言編譯得到的可執(zhí)行文件加載到內(nèi)存運(yùn)行時(shí)不同變量分配存儲(chǔ)位置,并通過(guò)在Ubuntu 18.04系統(tǒng)和
    發(fā)表于 01-13 14:23 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>程序編譯后<b class='flag-5'>內(nèi)存</b>地址的<b class='flag-5'>分配</b>

    C語(yǔ)言怎么建立內(nèi)存的動(dòng)態(tài)分配

    C語(yǔ)言中,全局變量是分配在內(nèi)存中的靜態(tài)存儲(chǔ)區(qū)的,非靜態(tài)的局部變量,包括形參是分配在內(nèi)存中的動(dòng)態(tài)存儲(chǔ)
    的頭像 發(fā)表于 03-10 15:30 ?762次閱讀

    內(nèi)存儲(chǔ)器與外存儲(chǔ)器的主要區(qū)別

    在計(jì)算機(jī)系統(tǒng)中,存儲(chǔ)器是不可或缺的核心部件,它負(fù)責(zé)存儲(chǔ)和處理各種數(shù)據(jù)和信息。根據(jù)存儲(chǔ)位置和功能的不同,存儲(chǔ)器可大致分為內(nèi)存儲(chǔ)器(簡(jiǎn)稱
    的頭像 發(fā)表于 05-22 18:16 ?2802次閱讀