99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

C語言在STM32中的內(nèi)存分配

GReq_mcu168 ? 來源:CSDN技術(shù)社區(qū)  ? 作者:CSDN技術(shù)社區(qū)  ? 2022-02-10 14:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

01前言

不說廢話,先上示例代碼

uint8_t num_byte[4];uint32_t num_word;const uint32_t num_word_const = 0x1234;uint32_t *point_heap;int main(void){  uint8_t num_byte_stack;  static uint8_t num_byte_static;    point_heap = (uint32_t *)malloc(4);  *point_heap = 0x3421;  free(point_heap);    num_byte_stack = 0x11;  #pragma section = "CSTACK"  char *pbeginstk = __section_begin("CSTACK");#pragma section = "HEAP"  char *pbeginheap = __section_begin("HEAP");        printf("CSTACK addr is 0x%x
",pbeginstk);  printf("HEAP addr is 0x%x
",pbeginheap);    printf("num_byte addr is 0x%x
",&num_byte);  printf("num_word addr is 0x%x
",&num_word);  printf("num_word_const addr is 0x%x
",&num_word_const);  printf("point_heap addr is 0x%x
",&point_heap);  printf("point_heap is 0x%x
",point_heap);  printf("num_byte_stack addr is 0x%x
",&num_byte_stack);  printf("num_byte_static addr is 0x%x
",&num_byte_static);}

打印如下

STACK addr is 0x20000320HEAP addr is 0x20000720num_byte addr is 0x20000308num_word addr is 0x2000030cnum_word_const addr is 0x8002a44point_heap addr is 0x20000310point_heap is 0x20000728num_byte_stack addr is 0x200006f8num_byte_static addr is 0x20000318

先說結(jié)論:

num_byte、num_word、num_byte_static和point_heap存儲在內(nèi)部RAM中。

num_byte_stack存貯在棧中。

point_heap申請到的內(nèi)存在堆中。

num_word_const在內(nèi)部flash中。

如果是有同學(xué)對這個了然于胸,可以出門左轉(zhuǎn)了,如果有些同學(xué)有興趣,可以進一步往下看。

02大小端

因為后面的內(nèi)容涉及到大小端問題,這里先說下大小端問題。

大端(Big-endian):數(shù)據(jù)的高位字節(jié)存放在地址的低端低位字節(jié)存放在地址高端;

小端(Little-endian):數(shù)據(jù)的高位字節(jié)存放在地址的高端低位字節(jié)存放在地址低端;

例如:

數(shù)據(jù)0x12345678存儲格式

大端格式

低地址<----0x12|0x34|0x56|0x78---->高地址

小端格式

低地址<----0x78|0x56|0x34|0x12---->高地址

C語言在STM32中的內(nèi)存分配

其中的地址,一般由編譯器分配,也可在程序中自行指定。從上表中,可以清晰的看到,大小端是以字節(jié)為單位進行數(shù)據(jù)儲存的方式。大端通俗的理解就是賦值數(shù)從左自右;小端則是從右自左。

我們常用的X86結(jié)構(gòu)是小端模式,而KEILC51則為大端模式。很多的ARM,DSP都為小端模式,本文使用的平臺STM32F207就是小段模式。

03逐步分析

如果有同學(xué)對這部分不是很熟悉,建議先看一下我之前的推文《C語言的內(nèi)存分配》,先把C語言的堆棧,內(nèi)存等概念先熟悉下。

先說關(guān)于堆棧的問題,下面代碼可以打印出IAR平臺下STM32的堆棧起始位置。

#pragma section = "CSTACK"  char *pbeginstk = __section_begin("CSTACK");#pragma section = "HEAP"  char *pbeginheap = __section_begin("HEAP");

打印的結(jié)果如下

STACK addr is 0x20000320HEAP addr is 0x20000720

這個地址是否正確,我們可以在IARdebug時,使用Disassembly窗口查看。

C語言在STM32中的內(nèi)存分配

關(guān)于堆棧大小問題,如下

C語言在STM32中的內(nèi)存分配

可以查到棧的終止位置是0x20000720,堆的終止位置是0x20000920。注意:這里計算牽扯到大小端的問題。

通過計算:

棧的大小=0x20000720-0x20000320=0x400。

堆的大小=0x20000920-0x20000720=0x200。

這和我們在IAR中的堆棧配置是一樣的。

C語言在STM32中的內(nèi)存分配

接下來就先說一下分配在內(nèi)存的變量。

通過打印看出,num_byte、num_word、num_byte_static和point_heap并不在堆棧中,它們存儲在內(nèi)部RAM中。

使用Disassembly窗口查看如下

C語言在STM32中的內(nèi)存分配

這也驗證了static關(guān)鍵字,在修飾函數(shù)內(nèi)的局部變量時,這個變量將和全局變量一樣存儲在內(nèi)部ram中。

同時也說明了,STM32內(nèi)部分配內(nèi)存時候,是先分配全局變量(和static修飾的局部變量),再分配棧,最后再分配堆的。

對于棧的內(nèi)存分配,局部變量,也就是num_byte_stack是存儲在棧的范圍內(nèi)。

num_byte_stack addr is 0x200006f8

它的地址空間在棧中。因為在代碼中num_byte_stack =0x11;使用Disassembly窗口查看到對應(yīng)的地址數(shù)值是0x11。

C語言在STM32中的內(nèi)存分配

關(guān)于棧,再說一句,棧不僅僅保存了局部變量,它會在函數(shù)切換,中斷發(fā)生時保存現(xiàn)場,保存ARM內(nèi)核的寄存器,這些不是這篇文章的討論重點,這里先挖個坑,等以后有空再寫篇文章專門說說這個部分。

堆的問題,簡單來說:malloc申請的內(nèi)存都在堆中。point_heap指針指向的內(nèi)存地址就在堆的范圍內(nèi)。

point_heap is 0x20000728

代碼中*point_heap= 0x3421;在Disassembly窗口查看到對應(yīng)的地址數(shù)值是0x3421。

C語言在STM32中的內(nèi)存分配

最后一個num_word_const,const修飾的變量是存儲在內(nèi)部flash中的,它的地址在內(nèi)部flash范圍內(nèi)。

在代碼中也有對應(yīng)的賦值操作,constuint32_t num_word_const = 0x1234;在Disassembly窗口查看到對應(yīng)的地址數(shù)值是0x1234。

C語言在STM32中的內(nèi)存分配

原文標(biāo)題:C語言在STM32中的內(nèi)存分配

文章出處:【微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅


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

    關(guān)注

    8

    文章

    3123

    瀏覽量

    75262
  • STM32
    +關(guān)注

    關(guān)注

    2293

    文章

    11032

    瀏覽量

    364825
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141696

原文標(biāo)題:C語言在STM32中的內(nèi)存分配

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    主流的 MCU 開發(fā)語言為什么是 C 而不是 C++?

    單片機的地界兒里,C語言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C
    的頭像 發(fā)表于 05-21 10:33 ?442次閱讀
    主流的 MCU 開發(fā)<b class='flag-5'>語言</b>為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C</b>++?

    深入理解C語言C語言循環(huán)控制

    C語言編程,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進入無限循環(huán),C
    的頭像 發(fā)表于 04-29 18:49 ?1142次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>C</b><b class='flag-5'>語言</b>循環(huán)控制

    如何查看S32DSS32平臺的內(nèi)存分配?

    大家好,我正在使用 s32DS for s32 平臺,我想查看我的項目的內(nèi)存分配。我想知道分配給對象的內(nèi)存以及它們被分配到哪里,例如 SRA
    發(fā)表于 04-09 07:30

    C語言中結(jié)構(gòu)體與聯(lián)合體的深度解析:內(nèi)存布局與應(yīng)用場景

    一、基礎(chǔ)概念與核心差異 1.1 結(jié)構(gòu)體(Struct)的本質(zhì) **結(jié)構(gòu)體是C語言中實現(xiàn)數(shù)據(jù)封裝的基石,其核心特征在于內(nèi)存獨立性。每個成員變量在內(nèi)存
    發(fā)表于 04-08 09:18

    golang內(nèi)存分配

    內(nèi)存碎片. 線程擁有一定的 cache, 可用于無鎖分配. 同時 Go 對于 GC 后回收的內(nèi)存頁, 并不是馬上歸還給操作系統(tǒng), 而是會延遲歸還, 用于滿足未來的內(nèi)存需求. ?? ?
    的頭像 發(fā)表于 03-31 15:00 ?184次閱讀
    golang<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    快速搞懂C語言程序內(nèi)存分區(qū)!

    程序運行過程,操作系統(tǒng)會根據(jù)程序的需要,將內(nèi)存劃分為多個功能不同的區(qū)段,以便更高效地管理內(nèi)存資源和確保程序的穩(wěn)定運行。不同的內(nèi)存區(qū)段負責(zé)
    的頭像 發(fā)表于 03-14 17:37 ?662次閱讀
    快速搞懂<b class='flag-5'>C</b><b class='flag-5'>語言</b>程序<b class='flag-5'>內(nèi)存</b>分區(qū)!

    分析C語言代碼結(jié)構(gòu)的設(shè)計問題

    來分析一個C語言代碼結(jié)構(gòu)的設(shè)計問題。 這段代碼,使用了兩次malloc,分別給 p1 和 p2 申請了內(nèi)存。用完后,內(nèi)存釋放,防止內(nèi)存泄漏。
    的頭像 發(fā)表于 02-11 09:31 ?370次閱讀

    EE-62:C語言中訪問短字內(nèi)存

    電子發(fā)燒友網(wǎng)站提供《EE-62:C語言中訪問短字內(nèi)存.pdf》資料免費下載
    發(fā)表于 01-07 14:02 ?0次下載
    EE-62:<b class='flag-5'>在</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>中訪問短字<b class='flag-5'>內(nèi)存</b>

    C語言中申請的堆內(nèi)存能不能自動釋放

    C語言中申請的堆內(nèi)存能不能自動釋放?每次都要手動 free 太麻煩,也容易忘記。 學(xué)過 C++ 的同學(xué),應(yīng)該首先能想到智能指針。 但是這是C
    的頭像 發(fā)表于 11-27 09:33 ?518次閱讀

    解讀版|Air780E軟件C語言內(nèi)存數(shù)組的神秘面紗!

    今天我們來揭開Air780E 軟件 C 語言內(nèi)存數(shù)組的神秘面紗,希望有所收獲。
    的頭像 發(fā)表于 11-17 10:00 ?639次閱讀
    解讀版|Air780E軟件<b class='flag-5'>中</b><b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內(nèi)存</b>數(shù)組的神秘面紗!

    C語言指針學(xué)習(xí)筆記

    本文從底層內(nèi)存分析,徹底讓讀者明白C語言指針的本質(zhì)。
    的頭像 發(fā)表于 11-05 17:40 ?639次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>指針學(xué)習(xí)筆記

    C語言C++結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語言C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?767次閱讀

    C語言與Java語言的對比

    C語言和Java語言都是當(dāng)前編程領(lǐng)域中的重要成員,它們各自具有獨特的優(yōu)勢和特點,適用于不同的應(yīng)用場景。以下將從語法特性、內(nèi)存管理、跨平臺性、性能、應(yīng)用領(lǐng)域等多個方面對
    的頭像 發(fā)表于 10-29 17:31 ?1070次閱讀

    轉(zhuǎn)載 golang內(nèi)存分配

    . 線程擁有一定的 cache, 可用于無鎖分配. 同時 Go 對于 GC 后回收的內(nèi)存頁, 并不是馬上歸還給操作系統(tǒng), 而是會延遲歸還, 用于滿足未來的內(nèi)存需求. ?? ? 1.
    的頭像 發(fā)表于 09-05 14:12 ?492次閱讀
    轉(zhuǎn)載 golang<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    技術(shù)干貨驛站 ▏深入理解C語言:基本數(shù)據(jù)類型和變量

    C語言中,數(shù)據(jù)類型和變量是編程的基礎(chǔ),也是理解更復(fù)雜概念的關(guān)鍵。數(shù)據(jù)類型決定了變量的內(nèi)存分配、存儲范圍和操作方式,而變量則是存儲數(shù)據(jù)的容器
    的頭像 發(fā)表于 07-26 17:53 ?2751次閱讀
    技術(shù)干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:基本數(shù)據(jù)類型和變量