女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

C語言在STM32中的內存分配

GReq_mcu168 ? 來源:CSDN技術社區  ? 作者:CSDN技術社區  ? 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

先說結論:

num_byte、num_word、num_byte_static和point_heap存儲在內部RAM中。

num_byte_stack存貯在棧中。

point_heap申請到的內存在堆中。

num_word_const在內部flash中。

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

02大小端

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

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

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

例如:

數據0x12345678存儲格式

大端格式

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

小端格式

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

C語言在STM32中的內存分配

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

我們常用的X86結構是小端模式,而KEILC51則為大端模式。很多的ARMDSP都為小端模式,本文使用的平臺STM32F207就是小段模式。

03逐步分析

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

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

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

打印的結果如下

STACK addr is 0x20000320HEAP addr is 0x20000720

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

C語言在STM32中的內存分配

關于堆棧大小問題,如下

C語言在STM32中的內存分配

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

通過計算:

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

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

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

C語言在STM32中的內存分配

接下來就先說一下分配在內存的變量。

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

使用Disassembly窗口查看如下

C語言在STM32中的內存分配

這也驗證了static關鍵字,在修飾函數內的局部變量時,這個變量將和全局變量一樣存儲在內部ram中。

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

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

num_byte_stack addr is 0x200006f8

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

C語言在STM32中的內存分配

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

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

point_heap is 0x20000728

代碼中*point_heap= 0x3421;在Disassembly窗口查看到對應的地址數值是0x3421。

C語言在STM32中的內存分配

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

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

C語言在STM32中的內存分配

原文標題:C語言在STM32中的內存分配

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

審核編輯:湯梓紅


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

    關注

    8

    文章

    3108

    瀏覽量

    74973
  • STM32
    +關注

    關注

    2289

    文章

    11011

    瀏覽量

    362202
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140178

原文標題:C語言在STM32中的內存分配

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

    深入理解C語言C語言循環控制

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

    如何查看S32DSS32平臺的內存分配?

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

    golang內存分配

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

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

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

    EE-62:C語言中訪問短字內存

    電子發燒友網站提供《EE-62:C語言中訪問短字內存.pdf》資料免費下載
    發表于 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'>內存</b>

    C語言中申請的堆內存能不能自動釋放

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

    解讀版|Air780E軟件C語言內存數組的神秘面紗!

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

    C語言指針學習筆記

    本文從底層內存分析,徹底讓讀者明白C語言指針的本質。
    的頭像 發表于 11-05 17:40 ?550次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>指針學習筆記

    C語言與Java語言的對比

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

    轉載 golang內存分配

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

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

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

    tc397 + freertos + lwip + cycloneDDS中分配內存失敗了怎么解決?

    你好,我tc397使用tc397+freertos+lwip的cyscloneDDS,因為cycloneDDS需要分配較大的內存: ddsi_rbufpool_new: rb
    發表于 07-05 07:17

    PLC編程語言C語言的區別

    工業自動化和計算機編程領域中,PLC(可編程邏輯控制器)編程語言C語言各自扮演著重要的角色。盡管兩者都是編程語言,但它們
    的頭像 發表于 06-14 17:11 ?4357次閱讀

    ESP32S3+LVGL創建一個界面,請問能只SPIRAM分配內存,IRAM不分配嗎?

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