在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    3043

    瀏覽量

    74184
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10918

    瀏覽量

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

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137287

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    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 ?154次閱讀

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

    今天我們來揭開Air780E 軟件 C 語言內(nèi)存數(shù)組的神秘面紗,希望有所收獲。
    的頭像 發(fā)表于 11-17 10:00 ?286次閱讀
    解讀版|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 ?272次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>指針學(xué)習(xí)筆記

    C語言與Java語言的對比

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

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

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

    ESP32S3+LVGL創(chuàng)建一個界面,請問能只SPIRAM分配內(nèi)存,IRAM不分配嗎?

    各位前輩好。ESP32S3+LVGL的開發(fā)的過程中發(fā)現(xiàn),創(chuàng)建一個界面,會同時SPIRAM和IRAM分配相同大小的內(nèi)存。請問能只SPIRAM分配
    發(fā)表于 06-06 07:45

    FreeRTOS如何在中斷調(diào)用內(nèi)存分配函數(shù)?

    最近在玩FreeRTOS,遇到一個問題,就是不知如何在中斷調(diào)用內(nèi)存分配函數(shù)。pvPortMalloc函數(shù)中會調(diào)用xTaskResumeAll,而這個函數(shù)不能再中斷調(diào)用,所以請問中斷
    發(fā)表于 05-08 08:25

    你知道嗎? 51單片機也有動態(tài)內(nèi)存分配

    一、簡述其實在51單片機也可以使用動態(tài)內(nèi)存,動態(tài)內(nèi)存其實就是劃出一塊內(nèi)存區(qū)域,將這塊內(nèi)存進行管理,稱為
    的頭像 發(fā)表于 04-26 08:10 ?1612次閱讀
    你知道嗎? 51單片機也有動態(tài)<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

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

    RAM是與CPU直接交換數(shù)據(jù)的內(nèi)部存儲器,也叫主存(內(nèi)存)。 它可以隨時讀寫,而且速度很快,通常作為操作系統(tǒng)或其他正在運行的程序的臨時數(shù)據(jù)存儲媒介。 當(dāng)電源關(guān)閉時RAM不能保留數(shù)據(jù)(掉電數(shù)據(jù)消失哦)如果需要保存數(shù)據(jù),就必須把它們寫入一個長期的存儲設(shè)備
    的頭像 發(fā)表于 04-02 09:50 ?1422次閱讀
    淺談<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內(nèi)存</b>分區(qū)和<b class='flag-5'>STM32</b>存儲器<b class='flag-5'>分配</b>

    C語言內(nèi)存泄漏問題原理

    內(nèi)存泄漏問題只有使用堆內(nèi)存的時候才會出現(xiàn),棧內(nèi)存不存在內(nèi)存泄漏問題,因為棧內(nèi)存會自動
    發(fā)表于 03-19 11:38 ?558次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內(nèi)存</b>泄漏問題原理

    C語言的指針用法

    C語言編程善用指針可以簡化一些任務(wù)的處理,而對于一些任務(wù)(比如動態(tài)內(nèi)存分配),必須要有指針才行的。也就是說精通
    發(fā)表于 03-05 14:22 ?383次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的指針用法

    C語言中的動態(tài)內(nèi)存管理講解

    本章將講解 C 的動態(tài)內(nèi)存管理。C 語言內(nèi)存分配
    的頭像 發(fā)表于 02-23 14:03 ?412次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的動態(tài)<b class='flag-5'>內(nèi)存</b>管理講解

    Linux內(nèi)核內(nèi)存管理之內(nèi)核非連續(xù)物理內(nèi)存分配

    我們已經(jīng)知道,最好將虛擬地址映射到連續(xù)頁幀,從而更好地利用緩存并實現(xiàn)更低的平均內(nèi)存訪問時間。然而,如果對內(nèi)存區(qū)域的請求并不頻繁,那么考慮基于通過連續(xù)線性地址訪問非連續(xù)頁幀的分配方案是有意義的。該模式
    的頭像 發(fā)表于 02-23 09:44 ?1048次閱讀
    Linux內(nèi)核<b class='flag-5'>內(nèi)存</b>管理之內(nèi)核非連續(xù)物理<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    Linux內(nèi)核內(nèi)存管理之ZONE內(nèi)存分配

    內(nèi)核中使用ZONE分配器滿足內(nèi)存分配請求。該分配器必須具有足夠的空閑頁幀,以便滿足各種內(nèi)存大小請求。
    的頭像 發(fā)表于 02-21 09:29 ?931次閱讀
    主站蜘蛛池模板: 久久天天躁狠狠躁夜夜躁综合| 久久精品影院永久网址| 国产精品资源手机在线播放| 黄a在线观看| 国产亚洲人成网站天堂岛| 成人网18免费下| brazzersvideosex欧美最| 午夜影院日韩| 久久精品草| 成人啪啪免费视频| 黄色网大全| 国产精品天天爽夜夜欢张柏芝| 扒开双腿爽爽爽视频www| 国产在线一区二区三区四区| 国产黄色精品| 天天射天天射| 国产成人精品影视| 亚洲福利一区福利三区| 亚洲免费资源| 国模于子涵啪啪大胆| 一区二区三区视频免费观看| 欧美网站在线| 亚洲福利视频一区二区三区| 边做饭边被躁欧美三级小说| 国产亚洲自在精品久久| 亚洲第一看片| 一级毛片真人免费播放视频| 四虎永久地址4hu紧急入口| 欧美69视频在线| 艹逼视频免费| 国产小视频免费| 亚洲国产精品第一页| 亚洲乱亚洲乱妇41p| 免费观看的黄色网址| brazzersvideosex欧美最| 国产亚洲精品成人一区看片| 亚洲免费在线看| 色牛网| 国产大乳孕妇喷奶水在线观看| 奇米影视婷婷| 国产午夜毛片v一区二区三区|