chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

了解內(nèi)存:如何在嵌入式C語言中使用結(jié)構(gòu)

嵌入式星球 ? 2020-09-28 09:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

處理器如何訪問內(nèi)存?了解有關(guān)C語言結(jié)構(gòu)以及如何使用它們的更多信息。
本文將首先解釋內(nèi)存訪問粒度的概念,以便我們可以對處理器如何訪問內(nèi)存有一個(gè)基本的了解。然后,我們將仔細(xì)研究數(shù)據(jù)對齊的概念,并研究一些示例結(jié)構(gòu)的內(nèi)存布局。

在上一篇有關(guān)嵌入式C中的結(jié)構(gòu)的文章中,我們觀察到重新排列結(jié)構(gòu)中成員的順序可以更改存儲結(jié)構(gòu)所需的內(nèi)存量。我們還看到,當(dāng)為結(jié)構(gòu)的成員分配內(nèi)存時(shí),編譯器具有某些約束。這些被稱為數(shù)據(jù)對齊要求的約束條件允許處理器以可能在內(nèi)存布局中出現(xiàn)的一些浪費(fèi)空間(稱為“填充”)為代價(jià)更有效地訪問變量。

本文將首先解釋內(nèi)存訪問粒度的概念,以便我們可以對處理器如何訪問內(nèi)存有一個(gè)基本的了解。然后,我們將仔細(xì)研究數(shù)據(jù)對齊的概念,并研究一些示例結(jié)構(gòu)的內(nèi)存布局。

值得一提的是,計(jì)算機(jī)的存儲系統(tǒng)可能比這里介紹的復(fù)雜得多。本文的目的是討論一些對嵌入式系統(tǒng)進(jìn)行編程時(shí)可能有用的基本概念。

內(nèi)存訪問粒度

我們通常將內(nèi)存設(shè)想為單字節(jié)存儲位置的集合,如圖1所示。這些位置中的每一個(gè)都有一個(gè)唯一的地址,該地址使我們可以訪問該地址的數(shù)據(jù)。


圖1
但是,處理器通常以大于一個(gè)字節(jié)的塊的形式訪問內(nèi)存。例如,處理器可以按四個(gè)字節(jié)的塊訪問內(nèi)存。在這種情況下,我們可以設(shè)想圖1的12個(gè)連續(xù)字節(jié),如下圖2所示。


圖2
您可能想知道這兩種處理內(nèi)存的方式有何區(qū)別。在圖1中,處理器一次讀取一個(gè)字節(jié)并將其寫入內(nèi)存。請注意,在讀取或?qū)懭?/span>存儲器位置之前,我們需要訪問該存儲器單元,并且每次訪問存儲器都需要一段時(shí)間。假設(shè)我們要讀取圖1中的內(nèi)存的前八個(gè)字節(jié)。對于每個(gè)字節(jié),處理器都需要訪問內(nèi)存并讀取它。因此,要讀取前八個(gè)字節(jié)的內(nèi)容,處理器將必須訪問存儲器八次。

使用圖2,處理器一次從存儲器中讀取和寫入四個(gè)字節(jié)。因此,為了讀取前四個(gè)字節(jié),處理器訪問存儲器的地址0,并讀取四個(gè)連續(xù)的存儲位置(地址0至3)。同樣,要讀取下一個(gè)四個(gè)字節(jié)的塊,處理器需要再訪問一次內(nèi)存。它轉(zhuǎn)到地址4,并同時(shí)從地址4到7讀取存儲位置。對于字節(jié)大小的塊,需要八個(gè)內(nèi)存訪問才能讀取八個(gè)連續(xù)的內(nèi)存字節(jié)。但是,對于圖2,僅需要兩次內(nèi)存訪問。如上所述,每次內(nèi)存訪問都需要一些時(shí)間。由于圖2所示的內(nèi)存配置減少了訪問次數(shù),因此可以提高處理效率。

處理器訪問內(nèi)存時(shí)使用的數(shù)據(jù)大小稱為內(nèi)存訪問粒度。圖2描述了具有四字節(jié)內(nèi)存訪問粒度的系統(tǒng)。

內(nèi)存訪問邊界
硬件設(shè)計(jì)人員經(jīng)常采用另一項(xiàng)重要技術(shù)來使處理系統(tǒng)更高效:他們限制處理器,使其只能在特定邊界訪問內(nèi)存。例如,處理器可能只能在四字節(jié)邊界訪問圖2的內(nèi)存,如圖3中的紅色箭頭所示。


圖3
這種邊界限制會大大提高系統(tǒng)效率嗎?讓我們仔細(xì)看看。假定我們需要讀取地址為3和4(由圖3中的綠色和藍(lán)色矩形表示)的存儲單元的內(nèi)容。如果處理器可以從任意地址開始讀取四字節(jié)的塊,我們可以訪問地址3并通過一次內(nèi)存訪問來讀取兩個(gè)所需的內(nèi)存位置。但是,如上所述,處理器不能直接訪問任意地址。相反,它僅在特定邊界訪問存儲器。那么,如果處理器只能訪問四個(gè)字節(jié)的邊界,那么它將如何讀取地址3和4的內(nèi)容呢?

由于內(nèi)存訪問邊界的限制,處理器必須訪問地址為0的內(nèi)存位置并讀取四個(gè)連續(xù)的字節(jié)(地址0至3)。接下來,它必須使用移位操作將地址3的內(nèi)容與其他三個(gè)字節(jié)(地址0到2)分開。類似地,處理器可以訪問地址4并從地址4到7讀取另一個(gè)四字節(jié)的塊。最后,可以使用移位操作將所需的字節(jié)(藍(lán)色矩形)與其他三個(gè)字節(jié)分開。

如果沒有內(nèi)存訪問邊界限制,我們可以通過一次內(nèi)存訪問讀取地址3和4。但是,邊界限制迫使處理器兩次訪問內(nèi)存。那么,如果它使數(shù)據(jù)操作更加困難,為什么還要將內(nèi)存訪問限制在某些邊界呢?存在內(nèi)存訪問邊界限制是因?yàn)閷Φ刂愤M(jìn)行某些假設(shè)可以簡化硬件設(shè)計(jì)。例如,假設(shè)需要32位來尋址內(nèi)存塊中的所有字節(jié)。如果我們將地址限制為四字節(jié)邊界,則32位地址的兩個(gè)最低有效位將始終為零(因?yàn)樵摰刂穼⑹冀K被4整除)。因此,我們將能夠使用30位來尋址2 32字節(jié)的內(nèi)存。

數(shù)據(jù)對齊
既然我們知道基本處理器如何訪問內(nèi)存,我們就可以討論數(shù)據(jù)對齊要求。通常,任何K字節(jié)的C數(shù)據(jù)類型都必須具有K的倍數(shù)的地址。例如,四字節(jié)的數(shù)據(jù)類型只能存儲在地址0、4、8,…;不能將其存儲在地址1、2、3、5,...。這樣的限制簡化了處理器和存儲系統(tǒng)之間接口硬件的設(shè)計(jì)。

例如,考慮具有四字節(jié)內(nèi)存訪問粒度的處理器,該處理器只能在四字節(jié)邊界訪問內(nèi)存。假設(shè)有一個(gè)四字節(jié)變量存儲在地址1中,如圖4所示(這四個(gè)字節(jié)對應(yīng)于四種不同的顏色)。在這種情況下,我們將需要兩次內(nèi)存訪問和一些額外的工作才能讀取未對齊的四字節(jié)數(shù)據(jù)(“未對齊”是指將其拆分為兩個(gè)四個(gè)字節(jié)的塊)。該過程如圖所示。


圖4
但是,如果我們將四字節(jié)變量存儲在4的倍數(shù)的任何地址上,則只需要一次內(nèi)存訪問即可修改數(shù)據(jù)或讀取數(shù)據(jù)。

這就是為什么將K字節(jié)數(shù)據(jù)類型存儲在K的倍數(shù)的地址可以使系統(tǒng)效率更高的原因。因此,可以將C語言“char”變量(僅需要一個(gè)字節(jié))存儲在任何字節(jié)地址,但是必須將兩個(gè)字節(jié)的變量存儲在偶數(shù)地址。四字節(jié)類型必須從可被4整除的地址開始,八字節(jié)數(shù)據(jù)類型必須被存儲在被8整除的地址中。例如,假設(shè)在特定計(jì)算機(jī)上,“short”變量需要兩個(gè)字節(jié),“int”和“float”類型占用四個(gè)字節(jié),而“long”,“double””,而指針占據(jù)八個(gè)字節(jié)。這些數(shù)據(jù)類型中的每一個(gè)通常都應(yīng)具有K的倍數(shù)的地址,其中K由下表給出。


請注意,不同數(shù)據(jù)類型的大小可能會因編譯器和計(jì)算機(jī)體系結(jié)構(gòu)而異。sizeof()運(yùn)算符將是查找數(shù)據(jù)類型的實(shí)際大小的最佳方法。

結(jié)構(gòu)的內(nèi)存布局

現(xiàn)在,讓我們檢查一下結(jié)構(gòu)的內(nèi)存布局。考慮為32位計(jì)算機(jī)編譯以下結(jié)構(gòu):

structTest2{

uint8_tc;
uint32_td;
uint8_te;
uint16_tf;

}MyStruct;

我們知道將分配四個(gè)內(nèi)存位置以在結(jié)構(gòu)中存儲成員,并且內(nèi)存位置的順序?qū)⑴c聲明成員的順序匹配。第一個(gè)成員是一個(gè)字節(jié)的變量,可以存儲在任何地址。因此,第一個(gè)可用的存儲位置將分配給該變量。假定如圖5所示,編譯器將地址0分配給該變量。下一個(gè)成員是四字節(jié)數(shù)據(jù)類型,只能存儲在4的倍數(shù)的地址上。第一個(gè)可用的存儲位置是地址4。但是,這需要保留地址1、2和3未被使用。如您所見,數(shù)據(jù)對齊要求導(dǎo)致了內(nèi)存布局中一些浪費(fèi)的空間(或填充)。

下一個(gè)成員是e,它是一個(gè)一字節(jié)的變量??梢詫⒌谝粋€(gè)可用的存儲位置(圖5中的地址8)分配給該變量。接下來,我們到達(dá)f,它是一個(gè)兩個(gè)字節(jié)的變量??梢詫⑵浯鎯υ诳杀?整除的地址中。第一個(gè)可用空間是地址10。如您所見,將出現(xiàn)更多的填充以滿足數(shù)據(jù)對齊要求。


圖5

我們希望該結(jié)構(gòu)占用8個(gè)字節(jié),但實(shí)際上需要12個(gè)字節(jié)。有趣的是,如果我們了解數(shù)據(jù)對齊要求,則可以重新排列結(jié)構(gòu)中成員的順序,并提高內(nèi)存使用效率。例如,讓我們重寫下面的結(jié)構(gòu),其中成員從最大到最小排列。

structTest2{

uint32_td;
uint16_tf;
uint8_tc;
uint8_te;

}MyStruct;

在32位計(jì)算機(jī)上,上述結(jié)構(gòu)的內(nèi)存布局可能類似于圖6中所示的布局。


圖6
第一個(gè)結(jié)構(gòu)需要12個(gè)字節(jié),而新結(jié)構(gòu)僅需要8個(gè)字節(jié)。這是一項(xiàng)重大改進(jìn),尤其是在內(nèi)存受限的嵌入式處理器的情況下。

另外,請注意,結(jié)構(gòu)的最后一個(gè)成員之后可能會有一些填充字節(jié)。結(jié)構(gòu)的總大小必須被其最大成員的大小整除??紤]以下結(jié)構(gòu):

structTest3{

uint32_tc;
uint8_td;

}MyStruct2;


在這種情況下,內(nèi)存布局將如圖7所示。您可以看到,在內(nèi)存布局的末尾添加了三個(gè)填充字節(jié),以將結(jié)構(gòu)的大小增加到8個(gè)字節(jié)。這將使結(jié)構(gòu)大小可被結(jié)構(gòu)中較大成員(c成員,這是一個(gè)四字節(jié)的變量)的大小整除。


圖7

概要

  • 處理器通常以大于一個(gè)字節(jié)的塊的形式訪問內(nèi)存。這樣可以提高系統(tǒng)效率。

  • 處理器訪問內(nèi)存時(shí)使用的數(shù)據(jù)大小是處理器的內(nèi)存訪問粒度。

  • 處理器可能被限制為僅在某些邊界(例如,在四字節(jié)邊界)訪問存儲器。

  • 存在此內(nèi)存訪問限制是因?yàn)閷Φ刂愤M(jìn)行某些假設(shè)可以簡化硬件設(shè)計(jì)。

  • 通常,任何K字節(jié)的C數(shù)據(jù)類型都必須具有K的倍數(shù)的地址。此類限制簡化了處理器與內(nèi)存系統(tǒng)之間接口硬件的設(shè)計(jì)。

  • 數(shù)據(jù)對齊要求導(dǎo)致內(nèi)存布局中的某些空間浪費(fèi)(或填充)。

  • 結(jié)構(gòu)的最后一個(gè)成員之后可能會有一些填充字節(jié)。結(jié)構(gòu)的總大小必須被其最大成員的大小整除。

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

    關(guān)注

    183

    文章

    7642

    瀏覽量

    144525
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    131

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    CW32嵌入式軟件開發(fā)的必備知識

    合適的數(shù)據(jù)結(jié)構(gòu)和算法。 3 、計(jì)算機(jī)體系結(jié)構(gòu) 了解處理器架構(gòu),如ARM、x86等,以及指令集和內(nèi)存管理。 熟悉嵌入式系統(tǒng)的硬件組成,如微控制
    發(fā)表于 11-28 07:48

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

    C 語言在汽車電子控制系統(tǒng)開發(fā)中的主導(dǎo)地位。 2、設(shè)備驅(qū)動程序 設(shè)備驅(qū)動程序是嵌入式系統(tǒng)中連接硬件和軟件的橋梁,它負(fù)責(zé)實(shí)現(xiàn)嵌入式系統(tǒng)與外部設(shè)備之間的通信和控制。
    發(fā)表于 11-21 08:09

    2025年最佳的嵌入式編程語言有哪些呢?

    嵌入式系統(tǒng)是現(xiàn)代科技不可或缺的一部分。它們存在于家用電器、汽車、住宅、醫(yī)院、商店等各個(gè)領(lǐng)域。它們與我們的社會緊密相連。選擇合適的語言來構(gòu)建嵌入式系統(tǒng)對于成功至關(guān)重要。那么,2025年最佳的嵌入
    的頭像 發(fā)表于 11-14 10:27 ?843次閱讀
    2025年最佳的<b class='flag-5'>嵌入式</b>編程<b class='flag-5'>語言</b>有哪些呢?

    C語言是否會阻礙嵌入式的發(fā)展?

    門老朋友:C語言。電子工業(yè)已經(jīng)走過了50多年,而C語言仍然是超過六成嵌入式項(xiàng)目的首選。它驅(qū)動著全球數(shù)以億計(jì),甚至以萬億計(jì)的設(shè)備。但它的統(tǒng)治地
    的頭像 發(fā)表于 11-14 10:27 ?129次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>是否會阻礙<b class='flag-5'>嵌入式</b>的發(fā)展?

    ElfBoard科普課堂|為什么C語言嵌入式技術(shù)領(lǐng)域中的地位難以撼動?

    嵌入式技術(shù)領(lǐng)域,“C語言與硬件”的組合,常被比作計(jì)算機(jī)體系中的“二進(jìn)制與晶體管”——它們是無數(shù)智能設(shè)備穩(wěn)定運(yùn)行的底層支柱,貫穿了嵌入式應(yīng)用的核心環(huán)節(jié)。
    的頭像 發(fā)表于 11-06 10:00 ?6506次閱讀
    ElfBoard科普課堂|為什么<b class='flag-5'>C</b><b class='flag-5'>語言</b>在<b class='flag-5'>嵌入式</b>技術(shù)領(lǐng)域中的地位難以撼動?

    嵌入式需要掌握哪些核心技能?

    : 1)C語言與底層編程 核心地位:C語言嵌入式開發(fā)的基石,需精通指針操作、內(nèi)存管理、位運(yùn)算,
    發(fā)表于 10-21 16:25

    嵌入式達(dá)到什么水平才能就業(yè)?

    、LoRa、NB-IoT,能實(shí)現(xiàn)嵌入式設(shè)備與云端平臺的數(shù)據(jù)交互了解 RTOS 實(shí)時(shí)操作系統(tǒng):如 FreeRTOS、RT-Thread,能進(jìn)行任務(wù)創(chuàng)建、信號量管理、內(nèi)存分配
    發(fā)表于 09-15 10:20

    盤點(diǎn)嵌入式就業(yè)所需要的技能有哪些?

    ,把握未來的職業(yè)機(jī)遇。 1.智能汽車行業(yè): - 熟悉嵌入式編程語言,如C/C++、Python等。 - 掌握嵌入式系統(tǒng)設(shè)計(jì)與開發(fā)流程,
    發(fā)表于 08-11 15:43

    入行嵌入式應(yīng)該怎么準(zhǔn)備?

    知識: 一、C/C++編程C/C++是嵌入式系統(tǒng)開發(fā)中最常用的編程語言。熟練掌握
    發(fā)表于 08-06 10:34

    Linux嵌入式和單片機(jī)嵌入式的區(qū)別?

    : 單片機(jī)嵌入式 :開發(fā)環(huán)境相對簡單,通常使用C語言或匯編語言進(jìn)行編程,開發(fā)工具包括Keil、IAR等。 Linux嵌入式 :開發(fā)環(huán)境較
    發(fā)表于 06-20 09:46

    嵌入式開發(fā)入門指南:從零開始學(xué)習(xí)嵌入式

    特定功能的計(jì)算機(jī)系統(tǒng),廣泛應(yīng)用于智能家居、工業(yè)控制、醫(yī)療設(shè)備、車載系統(tǒng)等領(lǐng)域。 2. 學(xué)習(xí)嵌入式開發(fā)的前置知識熟悉C語言編程掌握基本的數(shù)據(jù)結(jié)構(gòu)與算法
    發(fā)表于 05-15 09:29

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

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

    為什么嵌入式驅(qū)動開發(fā)工程師可以拿高薪?

    。 這些基礎(chǔ)知識有助于更好地理解嵌入式系統(tǒng)的工作原理。 2)精通編程語言: 在嵌入式開發(fā)中,C語言是最重要的編程
    發(fā)表于 01-07 16:56

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

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

    新手怎么學(xué)嵌入式?

    的運(yùn)行機(jī)制。例如,了解數(shù)據(jù)結(jié)構(gòu)中的鏈表、棧和隊(duì)列,對于在嵌入式編程中管理數(shù)據(jù)非常有幫助。 2. 選擇合適的編程語言 嵌入式開發(fā)中常用的編程語言
    發(fā)表于 12-12 10:51