91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

01前言

不說(shuō)廢話,先上示例代碼

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

先說(shuō)結(jié)論:

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

num_byte_stack存貯在棧中。

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

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

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

02大小端

因?yàn)楹竺娴膬?nèi)容涉及到大小端問(wèn)題,這里先說(shuō)下大小端問(wèn)題。

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

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

例如:

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

大端格式

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

小端格式

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

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

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

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

03逐步分析

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

先說(shuō)關(guān)于堆棧的問(wèn)題,下面代碼可以打印出IAR平臺(tái)下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

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

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

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

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

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

通過(guò)計(jì)算:

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

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

這和我們?cè)贗AR中的堆棧配置是一樣的。

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

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

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

使用Disassembly窗口查看如下

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

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

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

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

num_byte_stack addr is 0x200006f8

它的地址空間在棧中。因?yàn)樵诖a中num_byte_stack =0x11;使用Disassembly窗口查看到對(duì)應(yīng)的地址數(shù)值是0x11。

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

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

堆的問(wèn)題,簡(jiǎn)單來(lái)說(shuō):malloc申請(qǐng)的內(nèi)存都在堆中。point_heap指針指向的內(nèi)存地址就在堆的范圍內(nèi)。

point_heap is 0x20000728

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

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

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

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

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

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

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

審核編輯:湯梓紅


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

    關(guān)注

    9

    文章

    3215

    瀏覽量

    76407
  • STM32
    +關(guān)注

    關(guān)注

    2310

    文章

    11171

    瀏覽量

    373775
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7645

    瀏覽量

    145811

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    keilc語(yǔ)言的動(dòng)態(tài)分配內(nèi)存

    C程序,通常將內(nèi)存劃分為以下六個(gè)區(qū)域: (1)內(nèi)核區(qū)域。這塊區(qū)域是操作系統(tǒng)的,用戶不能使用。 (2)棧區(qū)。主要用于存放運(yùn)行函數(shù)而分配的局
    發(fā)表于 01-21 06:04

    【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配

    單位分配內(nèi)存。Slab分配器是建立頁(yè)分配器的基礎(chǔ)上,從中獲取頁(yè)并將它們拆分為較小的內(nèi)存實(shí)體。k
    發(fā)表于 01-16 20:05

    C語(yǔ)言嵌入式系統(tǒng)編程注意事項(xiàng)-內(nèi)存操作

    C語(yǔ)言嵌入式系統(tǒng)編程注意事項(xiàng)之內(nèi)存操作 嵌入式系統(tǒng)的編程,常常要求特定的
    發(fā)表于 01-04 07:31

    嵌入式C語(yǔ)言中各變量存儲(chǔ)位置

    C語(yǔ)言的程序,對(duì)變量的使用還有以下幾點(diǎn)需要注意 1. 體定義的變量通常是棧上,不需要在程序中進(jìn)行管理,由編繹器處理。 2. 用mal
    發(fā)表于 12-25 07:54

    嵌入式系統(tǒng),動(dòng)態(tài)分配內(nèi)存可能發(fā)生的問(wèn)題是什么?

    盡管不像非嵌入式計(jì)算機(jī)那么常見(jiàn),嵌入式系統(tǒng)還是有從堆(heap)動(dòng)態(tài)分配內(nèi)存的過(guò)程的。 那么嵌入式系統(tǒng),動(dòng)態(tài)分配
    發(fā)表于 12-22 09:42

    C語(yǔ)言單元測(cè)試嵌入式軟件開(kāi)發(fā)的作用及專業(yè)工具的應(yīng)用

    一、C語(yǔ)言嵌入式開(kāi)發(fā)的現(xiàn)狀與重要性 C語(yǔ)言嵌入
    發(fā)表于 12-18 11:46

    C語(yǔ)言內(nèi)存池使用

    C語(yǔ)言內(nèi)存管理,從來(lái)都是一個(gè)讓人頭禿的問(wèn)題。要想更自由地管理內(nèi)存,就必須去堆申請(qǐng),然后還需要考慮何時(shí)釋放,萬(wàn)一釋放不當(dāng),或者沒(méi)有及時(shí)釋放
    發(fā)表于 12-11 07:57

    C語(yǔ)言的編程技巧

    一個(gè)成員是一個(gè)未知大小的數(shù)組,適用于動(dòng)態(tài)分配內(nèi)存并關(guān)聯(lián)一個(gè)可變長(zhǎng)度的數(shù)組。? ?3、匿名結(jié)構(gòu)體和聯(lián)合體?:C語(yǔ)言允許結(jié)構(gòu)體或聯(lián)合體
    發(fā)表于 11-27 06:46

    C語(yǔ)言特性

    訪問(wèn)內(nèi)存地址,對(duì)內(nèi)存的數(shù)據(jù)進(jìn)行讀寫操作,還可以控制硬件的寄存器,實(shí)現(xiàn)對(duì)硬件設(shè)備的精確控制。這種底層操作的能力,使得 C 語(yǔ)言
    發(fā)表于 11-24 07:01

    C語(yǔ)言嵌入式開(kāi)發(fā)的應(yīng)用

    1、控制系統(tǒng)開(kāi)發(fā) 工業(yè)控制領(lǐng)域,C 語(yǔ)言是當(dāng)之無(wú)愧的中流砥柱。無(wú)論是工業(yè)自動(dòng)化生產(chǎn)線的運(yùn)動(dòng)控制、溫度控制、壓力控制等系統(tǒng),還是汽車電子
    發(fā)表于 11-21 08:09

    靈活高效ZBUFF — C內(nèi)存數(shù)據(jù)操作庫(kù):優(yōu)化內(nèi)存管理的利器

    C語(yǔ)言開(kāi)發(fā),高效的內(nèi)存管理是提升程序性能的關(guān)鍵。ZBUFF作為一款靈活高效的內(nèi)存數(shù)據(jù)操作庫(kù),
    的頭像 發(fā)表于 08-14 18:01 ?725次閱讀
    靈活高效ZBUFF — <b class='flag-5'>C</b><b class='flag-5'>內(nèi)存</b>數(shù)據(jù)操作庫(kù):優(yōu)化<b class='flag-5'>內(nèi)存</b>管理的利器

    靈活高效雙引擎驅(qū)動(dòng):ZBUFF讓C語(yǔ)言內(nèi)存操作更智能!

    ZBUFF庫(kù)深度融合了智能內(nèi)存分配算法與實(shí)時(shí)監(jiān)測(cè)機(jī)制,能夠自動(dòng)適應(yīng)不同場(chǎng)景下的內(nèi)存需求。其自適應(yīng)碎片整理功能和錯(cuò)誤檢測(cè)模塊,不僅保障了內(nèi)存使用的高效性,更大幅降低了調(diào)試難度,助力開(kāi)發(fā)者
    的頭像 發(fā)表于 08-11 13:27 ?615次閱讀
    靈活高效雙引擎驅(qū)動(dòng):ZBUFF讓<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>內(nèi)存</b>操作更智能!

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

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

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

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

    golang內(nèi)存分配

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