色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

淺談C語言內存分區(qū)和STM32存儲器分配

技術讓夢想更偉大 ? 來源:技術讓夢想更偉大 ? 2024-04-02 09:50 ? 次閱讀

一、C語言內存分區(qū)

C語言內存分區(qū)示意圖如下:

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

1. 棧區(qū)

棧區(qū)介紹

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

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

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

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

存放內容

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

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

2. 堆區(qū)

堆區(qū)介紹

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

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

調用函數(shù)

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

void *malloc(size_t);

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

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

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

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

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

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

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

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

.bss段

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

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

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

.data段

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

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

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

4. 常量區(qū)

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

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

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

5. 代碼區(qū)

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

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

二、STM32存儲器分配

1. 隨機存儲器—RAM

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

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

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

2. 只讀存儲器—ROM

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

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

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

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ū)。

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

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

三、基于STM32代碼驗證

1. 詳細代碼如下

#include "main.h"
#include  //用于字符串處理
#include //用于printf打印
#include  //用于分配堆區(qū)---調用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(); //設置系統(tǒng)時鐘為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ū)-動態(tài)申請地址
");
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);        
}
}
審核編輯:黃飛

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

    關注

    38

    文章

    7525

    瀏覽量

    164151
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10898

    瀏覽量

    212601
  • 內存
    +關注

    關注

    8

    文章

    3045

    瀏覽量

    74205
  • STM32
    +關注

    關注

    2270

    文章

    10921

    瀏覽量

    356979
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137383

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    C語言知識總結:動態(tài)內存分配

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

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

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

    C語言程序設計中動態(tài)內存分配如何實現(xiàn)

    C語言程序設計中,動態(tài)內存分配如何實現(xiàn),需要注意哪些問題?
    發(fā)表于 09-28 16:53 ?1429次閱讀

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

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

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

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

    CPU對存儲器的讀寫

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

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

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

    內存儲器的分類

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

    存儲器分區(qū)內存管理與分區(qū)存儲管理

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

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

    本文目的是簡要介紹C語言編譯得到的可執(zhí)行文件加載到內存運行時不同變量分配存儲位置,并通過在Ubuntu 18.04系統(tǒng)和
    發(fā)表于 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語言怎么建立內存的動態(tài)分配

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

    內存儲器與外存儲器的主要區(qū)別

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

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

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

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

    內存儲器(內部存儲器)是計算機硬件的重要組成部分,它直接與中央處理(CPU)相連,用于存儲正在運行的程序和當前處理的數(shù)據(jù)。內存儲器的容量、
    的頭像 發(fā)表于 10-14 09:55 ?1019次閱讀
    主站蜘蛛池模板: 欧美 另类 美腿 亚洲 无码| 久久人妻少妇嫩草AV蜜桃99| 精品日韩欧美一区二区三区| 少妇无套内谢久久久久| 91桃色污无限免费看| 麻豆一二三四区乱码| 中文字幕无码亚洲视频| 久久精品亚洲AV中文2区金莲| 亚洲精品无码久久久久A片| 国产一区二区三区乱码在线观看| 神马午夜不卡片| 精品人妻无码一区二区三区蜜桃臀 | 国产69精品久久久久麻豆| 十九岁在线观看免费完整版电影| 好男人好资源在线观看免费视频| 亚洲.欧美.中文字幕在线观看| 国产一卡在线观看完整版| 259luxu高跟黑色丝袜系列| 免费无码又爽又黄又刺激网站| 99爱免费视频| 啪啪后入内射日韩| 成人短片迅雷下载| 色欲午夜无码久久久久久| 国产精品黄色大片| 亚洲欧洲日产国产 最新| 九色PORNY真实丨首页| 在线亚洲中文字幕36页| 欧美黑大炮18p| 大胸美女被吊起来解开胸罩| 忘忧草日本在线社区WWW电影| 国产手机在线亚洲精品观看| 亚洲一卡久久4卡5卡6卡7卡| 久久在精品线影院精品国产| 99视频国产在线| 色戒在线完整观看在线播放版| 国产精品日本欧美一区二区| 97色伦久久视频在观看| 亚洲欧洲日本无在线码播放 | 国产午夜小视频| 成人免费视频在线播放| 9797在线看片亚洲精品|