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

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

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

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

嵌入式系統(tǒng)編程的大小端和內(nèi)存對(duì)齊問題

電子工程師 ? 來源:張飛實(shí)戰(zhàn)電子 ? 作者:黃忠老師 ? 2021-08-27 10:54 ? 次閱讀

C語(yǔ)言是一種高級(jí)語(yǔ)言,在大多數(shù)情況下C語(yǔ)言的代碼是和具體的處理器體系結(jié)構(gòu)無關(guān)的。然而,在嵌入式系統(tǒng)編程中,有可能涉及對(duì)內(nèi)存的具體操作。在大小端和內(nèi)存對(duì)齊問題上,C語(yǔ)言就不能屏蔽不同體系結(jié)構(gòu)處理器的差別,也就是說同樣的C語(yǔ)言代碼在不同的體系結(jié)構(gòu)的處理器上,有可能產(chǎn)生不同的結(jié)果。

大小端問題又叫字節(jié)序的問題。在各種體系結(jié)構(gòu)的處理器中,對(duì)多字節(jié)數(shù)據(jù)的內(nèi)存操作有著不同的定義。處理器對(duì)內(nèi)存數(shù)據(jù)的操作有讀寫兩種,這就涉及處理器在讀寫一個(gè)多字節(jié)的內(nèi)存的時(shí)候,高字節(jié)是在內(nèi)存的高地址還是低地址。一般在32位或者16位的處理器中,都具有將32位數(shù)據(jù)和16位數(shù)據(jù)讀寫到內(nèi)存中的指令,這時(shí)不同的大小端模式將有不同的結(jié)果。

如果讀寫指令針對(duì)的數(shù)據(jù)長(zhǎng)度和類型是一致的,無論數(shù)據(jù)在內(nèi)存中存放的形式如何,處理器整體讀寫都沒有問題。這種整內(nèi)存協(xié)調(diào)的讀寫操作問題,一般不會(huì)涉及處理器的大小端。

當(dāng)處理器讀寫指令針對(duì)的數(shù)據(jù)長(zhǎng)度不一致的時(shí)候就會(huì)涉及大小端的問題,例如:

將0x76543210整體放入內(nèi)存,然后在內(nèi)存的首地址用單字節(jié)讀取的命令讀出。

如果不知道大小端模式的情況下,讀取的值是多少你能確定嗎?

這時(shí)就涉及處理器是大端還是小端的問題。

對(duì)于小端處理器,寫內(nèi)存的時(shí)候會(huì)將內(nèi)存低地址處放入源數(shù)據(jù)的低字節(jié),在內(nèi)存的高地址處放入源數(shù)據(jù)的高字節(jié);讀內(nèi)存的時(shí)候,將內(nèi)存中低地址的數(shù)據(jù)就視為目標(biāo)數(shù)據(jù)的低字節(jié),對(duì)應(yīng)的高地址數(shù)據(jù)是目標(biāo)數(shù)據(jù)的高字節(jié)。

對(duì)于大端處理器,跟小端就相反的。內(nèi)存低地址存放數(shù)據(jù)的高字節(jié),高地址存放數(shù)據(jù)的低字節(jié)。

上面的示例只是處理器自身讀取和寫入內(nèi)存的情況,在更多的情況下,內(nèi)存中的數(shù)據(jù)可能來自外界的輸入,例如:來自網(wǎng)絡(luò)的數(shù)據(jù)包;處理器在寫內(nèi)存的時(shí)候,這塊內(nèi)存也可能是給系統(tǒng)中別的設(shè)備使用的,例如:處理器寫顯示內(nèi)存的情況。這時(shí),就更需要注意處理器的大小端問題,只有大小端處理協(xié)調(diào)匹配,才能獲得正確的結(jié)果。

在C語(yǔ)言中,使用指針就可以操作內(nèi)存,指針的基本類型long和short分別代表了32位和16位的數(shù)據(jù)。使用16位或32位指針操作內(nèi)存的時(shí)候,同樣涉及內(nèi)存的大小端問題。

上面我們說了一下內(nèi)存讀寫的模式不同,一個(gè)地址存的數(shù)據(jù)不同。

接下來我們說一下內(nèi)存對(duì)齊的問題,有人會(huì)說了內(nèi)存對(duì)齊不對(duì)齊還需要你來管嗎?這個(gè)在寫程序的時(shí)候也是有講究的,那么到底什么是內(nèi)存對(duì)齊?為什么要有這個(gè)概念呢,我們來一起學(xué)習(xí)一下吧。

內(nèi)存對(duì)齊操作的含義是:對(duì)于一個(gè)4字節(jié)的數(shù)據(jù),要求其內(nèi)存是4字節(jié)對(duì)齊的(地址為4字節(jié)的整數(shù)倍)。32位對(duì)齊的含義是其內(nèi)存的地址的最低位是:0x0,0x4,0x8,0xC

16位對(duì)齊的含義是其內(nèi)存的地址的最低位是:0x0,0x2,0x4,0x6,0x8,0xA,0xC,0xE

顯然,對(duì)于單字節(jié)的內(nèi)存讀寫操作,沒有內(nèi)存對(duì)齊的問題。從處理器硬件的角度,處理器更適合處理對(duì)齊的內(nèi)存操作。對(duì)于非對(duì)齊的內(nèi)存操作,不同的處理器則有不同的結(jié)果。

局部變量建立在棧空間上的,由編譯器分配,一般保證它們都是對(duì)齊的。但是在程序中可能出現(xiàn)不對(duì)齊的內(nèi)存操作。對(duì)于嵌入式系統(tǒng)中常用的ARM體系結(jié)構(gòu),并不支持不對(duì)齊的地址操作,當(dāng)進(jìn)行不對(duì)齊的地址訪問的時(shí)候,處理器將引發(fā)異常。

在嵌入式程序的編寫過程中,更需要注意內(nèi)存對(duì)齊的問題。對(duì)于內(nèi)存操作,使用字節(jié)操作(8bit)不會(huì)有內(nèi)存對(duì)齊的問題,但是效率比較低。在32位系統(tǒng)中,應(yīng)該盡量使用32位的數(shù)據(jù)操作,但這將帶來內(nèi)存對(duì)齊的問題,因此需要根據(jù)系統(tǒng)的具體情況選擇合適的內(nèi)存操作。

我們?cè)賮碚f說常糾結(jié)或者容易迷惑的結(jié)構(gòu)體成員的對(duì)齊問題。

結(jié)構(gòu)體是一個(gè)基本的語(yǔ)法單元。在32位系統(tǒng)中,編譯器一般會(huì)對(duì)結(jié)構(gòu)體的成員變量作一定的對(duì)齊處理。例如,在程序中定義如下結(jié)構(gòu)體:

typedef struct _S1

{

char m1;

int m2;

char m3;

short m4;

}S1;

在結(jié)構(gòu)體的定義上,結(jié)構(gòu)體的大小應(yīng)該是各個(gè)結(jié)構(gòu)體成員的大小之和。但是,對(duì)于上面這個(gè)結(jié)構(gòu)體S1,它的大小并不等于4個(gè)成員變量之和。在這種定義中,三個(gè)成員變量之和是1+4+2+2=8,但是結(jié)構(gòu)體的大小并不是8字節(jié)。

編譯器在處理結(jié)構(gòu)體的時(shí)候,默認(rèn)將結(jié)構(gòu)體內(nèi)部各個(gè)變量的內(nèi)存都是對(duì)齊的,由此在結(jié)構(gòu)體的內(nèi)部可能出現(xiàn)一些空的字節(jié)。

一般情況下,在結(jié)構(gòu)體含有4字節(jié)長(zhǎng)整型成員的時(shí)候,結(jié)構(gòu)體的大小將是4字節(jié)的倍數(shù)。為了對(duì)齊可能需要在結(jié)構(gòu)體的最后補(bǔ)充1~3個(gè)字節(jié)。

如果結(jié)構(gòu)體中含有2字節(jié)短整型成員的時(shí)候,結(jié)構(gòu)體的大小將是2字節(jié)的倍數(shù)。為了對(duì)齊可能需要在結(jié)構(gòu)體的最后補(bǔ)充一個(gè)字節(jié)。

這個(gè)算字節(jié)數(shù)的一般出現(xiàn)在找工作中的筆試題的概率還是很高的,其實(shí)就是考察的對(duì)這個(gè)內(nèi)存對(duì)齊的掌握。

責(zé)任編輯:haq

聲明:本文內(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)注

    5082

    文章

    19126

    瀏覽量

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

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136842

原文標(biāo)題:在嵌入式系統(tǒng)中大小端和對(duì)齊問題

文章出處:【微信號(hào):CanaanTech,微信公眾號(hào):嘉楠科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    嵌入式系統(tǒng)的發(fā)展,嵌入式操作系統(tǒng)也變得越來越重要。學(xué)習(xí)嵌入式操作系統(tǒng)可以幫助你更好地管理
    發(fā)表于 12-12 10:51

    嵌入式系統(tǒng)開發(fā)與硬件的關(guān)系 嵌入式系統(tǒng)開發(fā)常見問題解決

    系統(tǒng)開發(fā)與硬件關(guān)系的幾個(gè)關(guān)鍵點(diǎn): 硬件依賴性 :嵌入式系統(tǒng)的軟件必須能夠在特定的硬件上運(yùn)行,這包括處理器、內(nèi)存、輸入/輸出接口等。軟件必須能夠充分利用硬件的特性,同時(shí)繞過其限制。 資源
    的頭像 發(fā)表于 12-09 09:38 ?257次閱讀

    ARM嵌入式系統(tǒng)內(nèi)存對(duì)齊的重要性

    嵌入式系統(tǒng)軟件開發(fā),經(jīng)常在代碼中看到各種各樣的對(duì)齊,很多時(shí)候我們都是知其然不知其所以然,知道要做好各種對(duì)齊,但是不明白為什么要對(duì)齊,不
    的頭像 發(fā)表于 11-11 17:17 ?854次閱讀
    ARM<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>中<b class='flag-5'>內(nèi)存</b><b class='flag-5'>對(duì)齊</b>的重要性

    嵌入式 Linux 操作系統(tǒng)配置

    隨著物聯(lián)網(wǎng)(IoT)和智能設(shè)備的快速發(fā)展,嵌入式系統(tǒng)在各個(gè)領(lǐng)域扮演著越來越重要的角色。Linux因其開源、靈活和穩(wěn)定的特性,成為嵌入式系統(tǒng)的首選操作
    的頭像 發(fā)表于 11-06 10:22 ?391次閱讀

    嵌入式常用數(shù)據(jù)結(jié)構(gòu)有哪些

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

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

    一系列課程和技術(shù),包括但不限于以下內(nèi)容: 1、基礎(chǔ)知識(shí):學(xué)習(xí)計(jì)算機(jī)組成原理、數(shù)字電路、模擬電路等基礎(chǔ)知識(shí),建立對(duì)計(jì)算機(jī)硬件的認(rèn)知與理解。 2、編程語(yǔ)言:掌握至少一種嵌入式系統(tǒng)常用的編程
    發(fā)表于 07-02 10:10

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

    代碼以提高性能,包括減少內(nèi)存使用、提高處理速度等。 16. 調(diào)試技巧:掌握嵌入式系統(tǒng)的調(diào)試技巧,包括使用調(diào)試器、日志記錄和性能分析工具。 17. 參加競(jìng)賽和挑戰(zhàn):參加編程競(jìng)賽或黑客馬拉
    發(fā)表于 06-21 10:01

    嵌入式系統(tǒng)的外設(shè)器件選擇

    作者:DigiKey Editor 嵌入式系統(tǒng)除了最重要的為處理器選擇之外,配合的相關(guān)外設(shè)器件也是嵌入式系統(tǒng)的重要組成部分,包括內(nèi)存、時(shí)鐘(
    的頭像 發(fā)表于 05-05 09:38 ?913次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>的外設(shè)器件選擇

    嵌入式編程片上系統(tǒng)是什么

    嵌入式編程片上系統(tǒng)(Embedded Programmable System-on-Chip,或簡(jiǎn)稱EPSoC)是一種特殊的嵌入式系統(tǒng),它
    的頭像 發(fā)表于 03-28 15:33 ?570次閱讀

    嵌入式fpga是什么意思

    嵌入式FPGA是指將FPGA技術(shù)集成到嵌入式系統(tǒng)中的一種解決方案。嵌入式系統(tǒng)是一種為特定應(yīng)用而設(shè)計(jì)的計(jì)算機(jī)
    的頭像 發(fā)表于 03-15 14:29 ?1260次閱讀

    fpga是嵌入式

    FPGA(現(xiàn)場(chǎng)可編程門陣列)不是嵌入式系統(tǒng),但FPGA在嵌入式系統(tǒng)中有著重要的應(yīng)用。
    的頭像 發(fā)表于 03-14 17:19 ?2322次閱讀

    fpga與嵌入式的區(qū)別 嵌入式和fpga開發(fā)有什么關(guān)系

    fpga與嵌入式的區(qū)別 FPGA與嵌入式系統(tǒng)在設(shè)計(jì)和應(yīng)用上存在一些關(guān)鍵的區(qū)別,具體如下: 靈活性:FPGA具有高度的靈活性,可以根據(jù)需要重新編程以實(shí)現(xiàn)不同的功能。而
    的頭像 發(fā)表于 03-14 17:04 ?6902次閱讀

    嵌入式軟件開發(fā)應(yīng)該掌握哪些知識(shí)?

    掌握的知識(shí) 1.基礎(chǔ)知識(shí) 1.1 c/c++編程語(yǔ)言和數(shù)據(jù)結(jié)構(gòu) C/C++ 是嵌入式系統(tǒng)中常用的編程語(yǔ)言,因?yàn)樗鼈兲峁┝酥苯釉L問硬件的能力。通過使用特定的編譯器和調(diào)用硬件相關(guān)的接口,可
    發(fā)表于 02-19 11:23

    嵌入式學(xué)習(xí)步驟

    語(yǔ)言編寫。但是,有些嵌入式系統(tǒng)也使用其他編程語(yǔ)言,例如Python或Java。 (3).了解硬件:深入了解您要控制的硬件設(shè)備的功能和特性。您需要了解嵌入式
    發(fā)表于 02-02 15:24

    嵌入式系統(tǒng)的應(yīng)用實(shí)例

    嵌入式系統(tǒng)的三個(gè)基本要素是嵌入性、專用性與計(jì)算機(jī)系統(tǒng)
    的頭像 發(fā)表于 01-22 09:57 ?1077次閱讀
    主站蜘蛛池模板: 欧美三级第一页| 很狠操| 国产精品嫩草影院一二三区入口| 午夜剧场官网| ssswww日本免费网站片| 天天看天天射天天碰| 国内精品视频| 黄色录像视频网站| 一级做a爰片久久毛片美女图片| 免费观看理论片毛片| 日操夜干| 高清不卡一区二区三区| 久久黄色精品视频| 久草cm| 性色爽爱性色爽爱网站| 丁香婷婷久久大综合| 亚洲国产成人久久精品影视| 亚色成人| 在线观看黄a| 亚洲一级免费视频| 免费看黄色网页| 黄色大成网站| 性欧美护士18xxxxhd视频| 成人女人a毛片在线看| 免费人成网ww777kkk手机| 日韩一级高清| 神马午夜限制| 亚洲欧美在线精品一区二区| 岛国中文字幕| 亚洲韩国欧美一区二区三区| 美女网站视频色| 国产精品自在线天天看片| 五月天丁香花婷婷| 亚洲精品九色在线网站| 精品一区二区三区三区| 狠狠色丁香久久婷婷综| 好大好猛好爽好深视频免费| 欧美污网站| 国产亚洲片| 日本三级免费观看| 九色九色九色在线综合888|