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

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

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

3天內不再提示

了解內存:如何在嵌入式C語言中使用結構

嵌入式星球 ? 2020-09-28 09:46 ? 次閱讀

處理器如何訪問內存?了解有關C語言結構以及如何使用它們的更多信息。
本文將首先解釋內存訪問粒度的概念,以便我們可以對處理器如何訪問內存有一個基本的了解。然后,我們將仔細研究數據對齊的概念,并研究一些示例結構的內存布局。

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

本文將首先解釋內存訪問粒度的概念,以便我們可以對處理器如何訪問內存有一個基本的了解。然后,我們將仔細研究數據對齊的概念,并研究一些示例結構的內存布局。

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

內存訪問粒度

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


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


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

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

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

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


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

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

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

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

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


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

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


請注意,不同數據類型的大小可能會因編譯器和計算機體系結構而異。sizeof()運算符將是查找數據類型的實際大小的最佳方法。

結構的內存布局

現在,讓我們檢查一下結構的內存布局。考慮為32位計算機編譯以下結構:

structTest2{

uint8_tc;
uint32_td;
uint8_te;
uint16_tf;

}MyStruct;

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

下一個成員是e,它是一個一字節(jié)的變量。可以將第一個可用的存儲位置(圖5中的地址8)分配給該變量。接下來,我們到達f,它是一個兩個字節(jié)的變量。可以將其存儲在可被2整除的地址中。第一個可用空間是地址10。如您所見,將出現更多的填充以滿足數據對齊要求。


圖5

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

structTest2{

uint32_td;
uint16_tf;
uint8_tc;
uint8_te;

}MyStruct;

在32位計算機上,上述結構的內存布局可能類似于圖6中所示的布局。


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

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

structTest3{

uint32_tc;
uint8_td;

}MyStruct2;


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


圖7

概要

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

  • 處理器訪問內存時使用的數據大小是處理器的內存訪問粒度。

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

  • 存在此內存訪問限制是因為對地址進行某些假設可以簡化硬件設計。

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

  • 數據對齊要求導致內存布局中的某些空間浪費(或填充)。

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

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

    關注

    180

    文章

    7626

    瀏覽量

    139623
  • 結構體
    +關注

    關注

    1

    文章

    130

    瀏覽量

    11004
收藏 人收藏

    評論

    相關推薦

    C語言中結構體與聯(lián)合體的深度解析:內存布局與應用場景

    一、基礎概念與核心差異 1.1 結構體(Struct)的本質 **結構體是C語言中實現數據封裝的基石,其核心特征在于內存獨立性。每個成員變量
    發(fā)表于 04-08 09:18

    Python在嵌入式系統(tǒng)中的應用場景

    你想把你的職業(yè)生涯提升到一個新的水平?Python在嵌入式系統(tǒng)中正在成為一股不可缺少的新力量。盡管傳統(tǒng)上嵌入式開發(fā)更多地依賴于CC++語言
    的頭像 發(fā)表于 03-19 14:10 ?376次閱讀

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

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

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

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

    新手怎么學嵌入式?

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

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

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

    C語言中的socket編程基礎

    Socket編程簡介 Socket是一種通信機制,允許程序之間進行通信。在C語言中,socket編程是網絡編程的基礎。通過使用socket,程序可以發(fā)送和接收數據,實現不同計算機之間的通信
    的頭像 發(fā)表于 11-01 16:51 ?865次閱讀

    零基礎嵌入式開發(fā)學習路線

    是一種集成了處理器、內存、輸入輸出接口等功能的微型電路板,它是嵌入式開發(fā)的基礎硬件設備。學習單片機可以讓你了解硬件的基本原理和操作方法,比如如何連接電源、如何配置引腳、如何編寫驅動程序等。目前應用最多
    發(fā)表于 10-25 15:55

    嵌入式系統(tǒng)的體系結構包括哪些

    嵌入式系統(tǒng)的體系結構通常是一個復雜而精細的架構,旨在滿足特定應用需求,同時兼顧系統(tǒng)的可靠性、效率、成本和體積等多方面因素。以下是對嵌入式系統(tǒng)體系結構的詳細解析,包括其主要組成部分、層次
    的頭像 發(fā)表于 09-02 15:25 ?2337次閱讀

    嵌入式常用數據結構有哪些

    嵌入式編程中,數據結構的選擇和使用對于程序的性能、內存管理以及開發(fā)效率都具有重要影響。嵌入式系統(tǒng)由于資源受限(如處理器速度、內存大小等),
    的頭像 發(fā)表于 09-02 15:25 ?856次閱讀

    七大嵌入式GUI盤點

    LCD設計提供高級支持,極大簡化了LCD設計。它是使用比較廣泛的一款GUI,配合GUI Builder或App Wizard上位機軟件,用起來也比較方便。emWin以C語言源代碼提供,使其成為嵌入式
    發(fā)表于 09-02 10:58

    嵌入式系統(tǒng)怎么學?

    C++或者Python。這些語言嵌入式系統(tǒng)開發(fā)中都被廣泛應用。 3、微處理器/微控制器架構:學習常見的微處理器和微控制器架構,如ARM、AVR、PIC等,了解其特性和應用場景。
    發(fā)表于 07-02 10:10

    如何提升嵌入式編程能力?

    其他硬件的數據手冊,了解其特性和編程接口。 6. 學習低級編程:嵌入式編程常常需要直接與硬件交互,因此學習如何進行低級編程,如結構體、枚舉類型、指針操作、位操作、內存映射I/O等。 7
    發(fā)表于 06-21 10:01

    嵌入式C語言結構體基本實現

    C語言中的數組只能允許程序員定義存儲相同類型數據。但是結構C語言編程中允許您存儲不同數據類型的數據。
    的頭像 發(fā)表于 05-11 08:49 ?1352次閱讀
    <b class='flag-5'>嵌入式</b>中<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>結構</b>體基本實現

    嵌入式系統(tǒng)軟硬件基礎知識大全

    可以存儲臨時數據。了解這些存儲器的特點和層次結構,有助于我們優(yōu)化嵌入式系統(tǒng)的性能和存儲需求。嵌入式系統(tǒng)的外設接口和通信協(xié)議是其與外部世界交互的關鍵。常見的接口類型包括UART、SPI、
    發(fā)表于 05-09 14:12
    主站蜘蛛池模板: 九九热精品视频在线播放 | 国产精品大全 | 亚洲成人在线免费观看 | 美女一级毛片毛片在线播放 | 欧美成人免费草草影院 | 免费一级特黄特色黄大任片 | 五月综合激情网 | 国产一级毛片国语版 | 美女视频永久黄网站免费观看国产 | 亚洲区一二三四区2021 | 天天干天天做天天操 | 日韩午夜r电影在线观看 | aa三级动态图无遮无挡 | 欧洲妇女成人淫片aaa视频 | 插插操操| 午夜两性网 | 最新看片网址 | 国产成人精品曰本亚洲77美色 | 午夜国产大片免费观看 | 扒开双腿疯狂进出爽爽爽 | 亚洲人成亚洲人成在线观看 | 最新色站 | 免费视频你懂得 | 在线观看中文字幕第一页 | 亚洲成人毛片 | 久久天天躁狠狠躁夜夜爽 | 性xxxxhd高清 | 新版天堂中文资源8在线 | 成人中文字幕一区二区三区 | 国产成视频| 欧美性猛交xxxx黑人猛交 | 亚洲一区在线视频 | 欧美性操 | 五月六月婷婷 | 在线观看不卡一区 | 日日噜噜夜夜狠狠va视频 | 给个网站可以在线观看你懂的 | 亚洲看黄| 日本免费不卡视频一区二区三区 | 一区二区三区四区视频在线 | 黄色在线播放视频 |