欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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ǔ)言中使用結(jié)構(gòu)的方法

h1654155282.3538 ? 來(lái)源:EEtoday ? 作者:EEtoday ? 2020-11-20 10:22 ? 次閱讀

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

內(nèi)存訪問粒度

我們通常將內(nèi)存設(shè)想為單字節(jié)存儲(chǔ)位置的集合,如圖1所示。每個(gè)位置都有一個(gè)唯一的地址,允許我們?cè)L問該地址的數(shù)據(jù)。

圖1

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

圖2

你可能想知道這兩種處理內(nèi)存的方式之間有什么區(qū)別。使用圖1,處理器一次讀取一個(gè)字節(jié)并向內(nèi)存寫入。請(qǐng)注意,在讀取內(nèi)存位置或?qū)懭雰?nèi)存之前,我們需要訪問該內(nèi)存單元,并且每次內(nèi)存訪問都需要一些時(shí)間。假設(shè)我們想要讀取圖1中存儲(chǔ)器的前八個(gè)字節(jié)。對(duì)于每個(gè)字節(jié),處理器需要訪問內(nèi)存并讀取它。因此,為了讀取前八個(gè)字節(jié)的內(nèi)容,處理器將必須訪問內(nèi)存八次。

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

內(nèi)存訪問邊界

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

圖3

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

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

如果沒有內(nèi)存訪問邊界限制,可以用一個(gè)內(nèi)存訪問讀取地址3和地址4。但是,邊界限制迫使處理器兩次訪問存儲(chǔ)器。那么,如果數(shù)據(jù)操作變得更加困難,為什么需要限制對(duì)某些邊界的內(nèi)存訪問呢??jī)?nèi)存訪問邊界存在限制,因?yàn)閷?duì)地址進(jìn)行某些假設(shè)可以簡(jiǎn)化硬件設(shè)計(jì)。例如,假設(shè)一個(gè)內(nèi)存塊中的所有字節(jié)都需要32位來(lái)尋址。如果將地址限制為四字節(jié)邊界,那么32位地址中的兩個(gè)最低有效位將始終為零(因?yàn)榈刂肥冀K可以被4整除)。因此,我們可以使用30位來(lái)尋址一個(gè)232字節(jié)的內(nèi)存。

數(shù)據(jù)對(duì)齊

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

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

圖4

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

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

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

    關(guān)注

    5096

    文章

    19193

    瀏覽量

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

    關(guān)注

    180

    文章

    7616

    瀏覽量

    137892
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言入門書籍《嵌入式Linux C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)教程》全本下載!!

    的數(shù)據(jù)、數(shù)據(jù)的輸入和輸出、運(yùn)算符和表達(dá)式、程序結(jié)構(gòu)和控制語(yǔ)句。第6章到主要講解了嵌入式Linux C語(yǔ)言中的數(shù)組,包括一維數(shù)組、多維數(shù)組、字符數(shù)組和字符串等。第7章主要講解了
    發(fā)表于 03-02 17:09

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

    ?了解內(nèi)存:如何在嵌入式C語(yǔ)言中使結(jié)構(gòu)學(xué)習(xí)嵌入式C編程語(yǔ)言
    發(fā)表于 09-09 16:09

    嵌入式C語(yǔ)言C語(yǔ)言的區(qū)別

    嵌入式C語(yǔ)言C語(yǔ)言的區(qū)別:最常用的系統(tǒng)編程語(yǔ)言C
    發(fā)表于 10-27 06:52

    C語(yǔ)言中使嵌入式SQL訪問Oracle數(shù)據(jù)庫(kù)的方法

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

    嵌入式SQL語(yǔ)言概述

    嵌入式SQL概述嵌入式SQL語(yǔ)言將SQL語(yǔ)言嵌入到某一種高級(jí)語(yǔ)言中使用這種高級(jí)
    發(fā)表于 12-21 06:55

    嵌入式C語(yǔ)言結(jié)構(gòu)設(shè)計(jì)_實(shí)驗(yàn)二

    主要介紹嵌入式C語(yǔ)言結(jié)構(gòu)設(shè)計(jì),從基礎(chǔ)講起,非常合適入門
    發(fā)表于 02-22 15:45 ?2次下載

    嵌入式C實(shí)現(xiàn)延時(shí)程序的不同變量的區(qū)別 幾種Linux嵌入式開發(fā)環(huán)境的簡(jiǎn)單介紹

    嵌入式C實(shí)現(xiàn)延時(shí)程序的不同變量的區(qū)別 幾種Linux嵌入式開發(fā)環(huán)境的簡(jiǎn)單介紹 ARM嵌入式開發(fā)基礎(chǔ) 對(duì)話微軟MVP:走進(jìn)嵌入式軟件開發(fā)
    發(fā)表于 04-14 07:24 ?1702次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>實(shí)現(xiàn)延時(shí)程序的不同變量的區(qū)別 幾種Linux<b class='flag-5'>嵌入式</b>開發(fā)環(huán)境的簡(jiǎn)單介紹

    嵌入式C語(yǔ)言中如何判斷數(shù)據(jù)是否損壞

    C語(yǔ)言中結(jié)構(gòu)體是非常有用的復(fù)合數(shù)據(jù)類型,正是有了結(jié)構(gòu)體,C語(yǔ)言
    發(fā)表于 08-19 11:46 ?809次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>如何判斷數(shù)據(jù)是否損壞

    標(biāo)準(zhǔn)c語(yǔ)言嵌入式,嵌入式C語(yǔ)言C語(yǔ)言的區(qū)別

    嵌入式C語(yǔ)言C語(yǔ)言的區(qū)別:最常用的系統(tǒng)編程語(yǔ)言C
    發(fā)表于 10-20 14:06 ?6次下載
    標(biāo)準(zhǔn)<b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>與<b class='flag-5'>嵌入式</b>,<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>與<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的區(qū)別

    C語(yǔ)言嵌入式培訓(xùn) 嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)

      學(xué)習(xí)嵌入式的基礎(chǔ)語(yǔ)言C語(yǔ)言,因此先掌握C語(yǔ)言對(duì)于后續(xù)
    發(fā)表于 11-03 21:06 ?32次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>嵌入式</b>培訓(xùn)  <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>程序設(shè)計(jì)基礎(chǔ)

    嵌入式C語(yǔ)言知識(shí)總結(jié)

    了一些這方面的經(jīng)驗(yàn)和思考,就希望總結(jié)下來(lái),系統(tǒng)的闡述嵌入式C語(yǔ)言的重要知識(shí)點(diǎn),就是這篇文章的由來(lái)。本文以自己嵌入式上的實(shí)踐為基礎(chǔ),
    發(fā)表于 12-20 19:44 ?12次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>知識(shí)總結(jié)

    簡(jiǎn)單介紹嵌入式C語(yǔ)言中常用的位操作

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

    嵌入式C語(yǔ)言中堆和棧的區(qū)別

    嵌入式C語(yǔ)言中,堆和棧都是用來(lái)存儲(chǔ)變量的內(nèi)存區(qū)域,但它們存儲(chǔ)和使用變量方面有很大的區(qū)別。
    的頭像 發(fā)表于 04-14 11:45 ?1498次閱讀

    嵌入式C語(yǔ)言之堆和棧介紹

    嵌入式C語(yǔ)言中,堆和棧都是用來(lái)存儲(chǔ)變量的內(nèi)存區(qū)域,但它們存儲(chǔ)和使用變量方面有很大的區(qū)別。
    的頭像 發(fā)表于 05-20 15:04 ?3059次閱讀

    嵌入式C語(yǔ)言結(jié)構(gòu)特點(diǎn)

    嵌入式開發(fā)中既有底層硬件的開發(fā)又涉及上層應(yīng)用的開發(fā),即涉及系統(tǒng)的硬件和軟件,C語(yǔ)言既具有匯編語(yǔ)言操作底層的優(yōu)勢(shì),又具有高級(jí)語(yǔ)言功能性強(qiáng)的特點(diǎn)
    的頭像 發(fā)表于 11-24 16:16 ?770次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>結(jié)構(gòu)</b>特點(diǎn)