国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺談C語言內存分區和STM32存儲器分配

技術讓夢想更偉大 ? 來源:技術讓夢想更偉大 ? 2024-04-02 09:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、C語言內存分區

C語言內存分區示意圖如下:

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

1. 棧區

棧區介紹

棧區由編譯器自動分配釋放,由操作系統自動管理,無須手動管理。

棧區上的內容只在函數范圍內存在,當函數運行結束,這些內容也會自動被銷毀。

棧區按內存地址由高到低方向生長,其最大大小由編譯時確定,速度快,但自由性差,最大空間不大。

棧區是先進后出原則,即先進去的被堵在屋里的最里面,后進去的在門口,釋放的時候門口的先出去。

存放內容

臨時創建的局部變量和const定義的局部變量存放在棧區。

函數調用和返回時,其入口參數和返回值存放在棧區。

2. 堆區

堆區介紹

堆區由程序員分配內存和釋放。

堆區按內存地址由低到高方向生長,其大小由系統內存/虛擬內存上限決定,速度較慢,但自由性大,可用空間大。

調用函數

用malloc等函數實現動態分布內存。

void *malloc(size_t);

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

用free函數進行內存釋放,否則會造成內存泄漏。

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

參數是開辟的內存的首地址。

3. 全局(靜態)區

全局(靜態)區介紹

通常是用于那些在編譯期間就能確定存儲大小的變量的存儲區,但它用于的是在整個程序運行期間都可見的全局變量和靜態變量。

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

.bss段

未初始化的全局變量和未初始化的靜態變量存放在.bss段。

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

.bss段不占用可執行文件空間,其內容由操作系統初始化。

.data段

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

已初始化的靜態變量存放在.data段。

.data段占用可執行文件空間,其內容有程序初始化。

4. 常量區

字符串、數字等常量存放在常量區。

const修飾的全局變量存放在常量區。

程序運行期間,常量區的內容不可以被修改。

5. 代碼區

程序執行代碼存放在代碼區,其值不能修改(若修改則會出現錯誤)。

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

二、STM32存儲器分配

1. 隨機存儲器—RAM

RAM是與CPU直接交換數據的內部存儲器,也叫主存(內存)。

它可以隨時讀寫,而且速度很快,通常作為操作系統或其他正在運行中的程序的臨時數據存儲媒介。

電源關閉時RAM不能保留數據(掉電數據消失哦)如果需要保存數據,就必須把它們寫入一個長期的存儲設備中(例如硬盤)。

2. 只讀存儲器—ROM

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

ROM所存數據穩定,斷電后所存數據也不會改變。

本文使用是STM32F103芯片,keil V5環境下默認的內存配置見下圖:

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

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

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

該芯片的內部分區如下圖所示:

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

三、基于STM32代碼驗證

1. 詳細代碼如下

#include "main.h"
#include  //用于字符串處理
#include //用于printf打印
#include  //用于分配堆區---調用malloc和free

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

//全局區
int q1;//未初始化全局變量
static int q2;//未初始化靜態變量
const  int   q3;//未初始化只讀變量

int   m1=1;//已初始化全局變量
static  int   m2=2;//已初始化靜態變量

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

int main(void)
{
SystemCoreClockUpdate(); //設置系統時鐘為72M
LED_GPIO_Config();
Uart3_init();

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

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

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

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

//全局區
static int mp1;//未初始化局部靜態變量
static  int   mp2=2;//已初始化局部靜態變量

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

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

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

printf("
堆區-動態申請地址
");
printf("已初始化局部int型指針變量p1   :0x%p
", p1);
printf("已初始化局部int型指針變量p2   :0x%p
", p2);

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

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

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

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

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

led485_flicker();
delay_ms(1000);

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    39

    文章

    7739

    瀏覽量

    171679
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11279

    瀏覽量

    225015
  • 內存
    +關注

    關注

    9

    文章

    3210

    瀏覽量

    76377
  • STM32
    +關注

    關注

    2309

    文章

    11162

    瀏覽量

    373471
  • C語言
    +關注

    關注

    183

    文章

    7644

    瀏覽量

    145605

原文標題:1. 詳細代碼如下

文章出處:【微信號:技術讓夢想更偉大,微信公眾號:技術讓夢想更偉大】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    什么是Bootloader 淺談STM32中bootloader的內存分配

    。Bootloader不但依賴于CPU的體系架構,而且依賴于嵌入式系統板級設備的配置。 3. STM32中bootloader的內存分配
    的頭像 發表于 02-15 06:10 ?1.9w次閱讀
    什么是Bootloader <b class='flag-5'>淺談</b><b class='flag-5'>STM32</b>中bootloader的<b class='flag-5'>內存</b><b class='flag-5'>分配</b>

    C語言知識總結:動態內存分配

    動態內存分配就 是指在程序執行的過程中動態地分配或者回收存儲空間的分配內存的方法。動態
    發表于 10-24 15:52 ?1295次閱讀

    C語言既然可以自動為變量分配內存,為什么還要用動態分配內存呢?

    不知道大家在學習C語言動態分配內存的時候有沒有過這樣的疑問,既然系統可以自動幫我們分配內存,為什
    發表于 12-13 11:14 ?1467次閱讀

    C語言程序設計中動態內存分配如何實現

    C語言程序設計中,動態內存分配如何實現,需要注意哪些問題?
    發表于 09-28 16:53 ?2253次閱讀

    應大家要求詳細講解下C語言內存分配-通俗理解

    最近很多同學希望了解C語言內存分配,雖然可以在互聯網上找到諸多的講解,但是你會發現要么不通俗易懂,要么不算太全面。而這些對于新手而言,又絕對會把你弄得暈頭轉向的,所以在此對網上和書本
    發表于 10-08 14:13

    C語言內存分配-通俗理解

    最近很多同學希望了解C語言內存分配,雖然可以在互聯網上找到諸多的講解,但是你會發現要么不通俗易懂,要么不算太全面。而這些對于新手而言,又絕對會把你弄得暈頭轉向的,所以在此對網上和書本
    發表于 10-08 14:57

    存儲器映射與寄存映射的原理分別是什么

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

    內存儲器的分類

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

    存儲器分區內存管理與分區存儲管理

    內存固定地劃分為若干個大小不等的分區供各個程序使用,每個分區的大小和位置都固定,系統運行期間不再重新劃分。
    發表于 05-26 10:28 ?3578次閱讀
    <b class='flag-5'>存儲器</b>的<b class='flag-5'>分區內存</b>管理與<b class='flag-5'>分區</b><b class='flag-5'>存儲</b>管理

    C語言程序編譯后內存地址的分配

    本文目的是簡要介紹C語言編譯得到的可執行文件加載到內存運行時不同變量分配存儲位置,并通過在Ubuntu 18.04系統和
    發表于 01-13 14:23 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>程序編譯后<b class='flag-5'>內存</b>地址的<b class='flag-5'>分配</b>

    C語言怎么建立內存的動態分配

    C語言中,全局變量是分配在內存中的靜態存儲區的,非靜態的局部變量,包括形參是分配在內存中的動態存儲
    的頭像 發表于 03-10 15:30 ?1457次閱讀

    內存儲器與外存儲器的主要區別

    在計算機系統中,存儲器是不可或缺的核心部件,它負責存儲和處理各種數據和信息。根據存儲位置和功能的不同,存儲器可大致分為內存儲器(簡稱
    的頭像 發表于 05-22 18:16 ?9874次閱讀

    內存儲器分為隨機存儲器和什么

    內存儲器是計算機系統中用于臨時存儲數據和程序的關鍵部件,它直接影響到計算機的運行速度和性能。內存儲器主要分為兩大類:隨機存儲器(RAM,Random Access Memory)和只讀
    的頭像 發表于 10-14 09:54 ?4661次閱讀

    內存儲器主要用來存儲什么

    內存儲器(內部存儲器)是計算機硬件的重要組成部分,它直接與中央處理(CPU)相連,用于存儲正在運行的程序和當前處理的數據。內存儲器的容量、
    的頭像 發表于 10-14 09:55 ?4158次閱讀

    快速搞懂C語言程序內存分區

    到動態分配的數據等內容。(內存分區圖示)理解這些內存分區的結構和特性,不僅有助于編寫更高效的代碼,還能幫助排查和解決如段錯誤、
    的頭像 發表于 03-14 17:37 ?1573次閱讀
    快速搞懂<b class='flag-5'>C</b><b class='flag-5'>語言</b>程序<b class='flag-5'>內存</b><b class='flag-5'>分區</b>!