精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

在嵌入式C語言中使用結構的方法

h1654155282.3538 ? 來源:EEtoday ? 作者:EEtoday ? 2020-11-20 10:22 ? 次閱讀

本文將首先解釋內存訪問粒度概念,以便可以了解處理器如何訪問內存。然后,將進一步了解數據對齊的概念,并研究一些示例結構的內存布局。在之前關于嵌入式C中結構的文章中,了解到重新排列結構中成員的順序可以改變存儲結構所需的內存量。還將看到編譯器在為結構成員分配內存時具有某些約束。這些約束被稱為數據對齊要求,允許處理器以可能出現在存儲器布局中的一些浪費空間(稱為“填充”)為代價來更有效地訪問變量。計算機的內存系統可能比這里介紹的要復雜得多。本文的目標是討論在編寫嵌入式系統時可能有用的一些基本概念。

內存訪問粒度

我們通常將內存設想為單字節存儲位置的集合,如圖1所示。每個位置都有一個唯一的地址,允許我們訪問該地址的數據。

圖1

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

圖2

你可能想知道這兩種處理內存的方式之間有什么區別。使用圖1,處理器一次讀取一個字節并向內存寫入。請注意,在讀取內存位置或寫入內存之前,我們需要訪問該內存單元,并且每次內存訪問都需要一些時間。假設我們想要讀取圖1中存儲器的前八個字節。對于每個字節,處理器需要訪問內存并讀取它。因此,為了讀取前八個字節的內容,處理器將必須訪問內存八次。

在圖2中,處理器一次讀取4個字節并將其寫入內存。因此,為了讀取前四個字節,處理器訪問存儲器的地址0并讀取四個連續的存儲位置(地址0到3)。同樣,要讀取下一個四字節塊,處理器需要再次訪問內存。它轉到地址4并同時從地址4到7讀取存儲位置。對于字節大小的塊,需要8次內存訪問來讀取連續8個字節的內存。但是,使用圖2,只需要兩次內存訪問。如上所述,每次內存訪問都需要一些時間。由于圖2中所示的存儲器配置減少了訪問次數,因此可以提高處理效率。處理器在訪問內存時使用的數據大小稱為內存訪問粒度。圖2描繪了具有四字節存儲器訪問粒度的系統。

內存訪問邊界

硬件設計人員經常采用另一種重要技術來提高處理系統的效率:它們限制處理器,使其只能在某些邊界訪問內存。例如,處理器可能僅能夠在四字節邊界上訪問圖2的內存,如圖3中的紅色箭頭所示。

圖3

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

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

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

數據對齊

既然已經知道基本處理器如何訪問內存,那么下面就可以可以討論數據對齊要求。通常,任何K字節C數據類型必須具有K的倍數的地址。例如,四字節數據類型只能存儲在地址0,4,8,中;它不能存儲在地址1,2,3,5。這些限制簡化了處理器和內存系統之間的接口硬件的設計。

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

圖4

但是,如果將一個四字節變量存儲在4的倍數的任何地址,只需要一個內存訪問來修改數據或讀取數據。所以將K字節數據類型存儲在K的倍數的地址可以提高系統的效率。因此,C語言“char”變量(只需要一個字節)可以存儲在任何字節地址,但是一個雙字節變量必須存儲在偶數地址中。四字節類型必須從可被4整除的地址開始,并且八字節數據類型必須存儲在可被8整除的地址。例如,假設在特定機器上,“short”變量需要兩個字節,“int”和“float”類型占用四個字節,“long”、“double”指針占用八個字節。這些數據類型中的每一種通常應具有K的倍數的地址,其中K由下表給出。

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

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

    關注

    5068

    文章

    19019

    瀏覽量

    303292
  • C語言
    +關注

    關注

    180

    文章

    7598

    瀏覽量

    136197
收藏 人收藏

    評論

    相關推薦

    C語言入門書籍《嵌入式Linux C語言程序設計基礎教程》全本下載!!

    的數據、數據的輸入和輸出、運算符和表達式、程序結構和控制語句。第6章到主要講解了嵌入式Linux C語言中的數組,包括一維數組、多維數組、字符數組和字符串等。第7章主要講解了
    發表于 03-02 17:09

    (精彩帖子合集)國外大牛帶你入門嵌入式C語言

    ?了解內存:如何在嵌入式C語言中使結構學習嵌入式C編程語言
    發表于 09-09 16:09

    嵌入式C語言C語言的區別

    嵌入式C語言C語言的區別:最常用的系統編程語言C
    發表于 10-27 06:52

    C語言中使嵌入式SQL訪問Oracle數據庫的方法

    使用C語言開發Oracle應用程序通常有兩種方法。一是利用嵌入式SQL語言,將SQL作為子語言
    發表于 12-15 06:35

    嵌入式SQL語言概述

    嵌入式SQL概述嵌入式SQL語言將SQL語言嵌入到某一種高級語言中使用這種高級
    發表于 12-21 06:55

    嵌入式C語言結構設計_實驗二

    主要介紹嵌入式C語言結構設計,從基礎講起,非常合適入門
    發表于 02-22 15:45 ?2次下載

    嵌入式C實現延時程序的不同變量的區別 幾種Linux嵌入式開發環境的簡單介紹

    嵌入式C實現延時程序的不同變量的區別 幾種Linux嵌入式開發環境的簡單介紹 ARM嵌入式開發基礎 對話微軟MVP:走進嵌入式軟件開發
    發表于 04-14 07:24 ?1622次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>實現延時程序的不同變量的區別 幾種Linux<b class='flag-5'>嵌入式</b>開發環境的簡單介紹

    嵌入式C語言中如何判斷數據是否損壞

    C語言中結構體是非常有用的復合數據類型,正是有了結構體,C語言
    發表于 08-19 11:46 ?775次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言中</b>如何判斷數據是否損壞

    標準c語言嵌入式,嵌入式C語言C語言的區別

    嵌入式C語言C語言的區別:最常用的系統編程語言C
    發表于 10-20 14:06 ?6次下載
    標準<b class='flag-5'>c</b><b class='flag-5'>語言</b>與<b class='flag-5'>嵌入式</b>,<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>與<b class='flag-5'>C</b><b class='flag-5'>語言</b>的區別

    C語言嵌入式培訓 嵌入式C語言程序設計基礎

      學習嵌入式的基礎語言C語言,因此先掌握C語言對于后續
    發表于 11-03 21:06 ?32次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>嵌入式</b>培訓  <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>程序設計基礎

    嵌入式C語言知識總結

    了一些這方面的經驗和思考,就希望總結下來,系統的闡述嵌入式C語言的重要知識點,就是這篇文章的由來。本文以自己嵌入式上的實踐為基礎,
    發表于 12-20 19:44 ?12次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>知識總結

    簡單介紹嵌入式C語言中常用的位操作

    嵌入式C語言中,使用位操作程序有很好的可讀性。以下就簡單介紹以下常用的位操作。
    的頭像 發表于 02-23 10:36 ?979次閱讀

    嵌入式C語言中堆和棧的區別

    嵌入式C語言中,堆和棧都是用來存儲變量的內存區域,但它們存儲和使用變量方面有很大的區別。
    的頭像 發表于 04-14 11:45 ?1340次閱讀

    嵌入式C語言之堆和棧介紹

    嵌入式C語言中,堆和棧都是用來存儲變量的內存區域,但它們存儲和使用變量方面有很大的區別。
    的頭像 發表于 05-20 15:04 ?2828次閱讀

    嵌入式C語言結構特點

    嵌入式開發中既有底層硬件的開發又涉及上層應用的開發,即涉及系統的硬件和軟件,C語言既具有匯編語言操作底層的優勢,又具有高級語言功能性強的特點
    的頭像 發表于 11-24 16:16 ?644次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>結構</b>特點