91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

電子工程師 ? 來(lái)源:張飛實(shí)戰(zhàn)電子 ? 作者:黃忠老師 ? 2021-08-27 10:54 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

對(duì)于小端處理器,寫(xiě)內(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é)。

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

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

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

接下來(lái)我們說(shuō)一下內(nèi)存對(duì)齊的問(wèn)題,有人會(huì)說(shuō)了內(nèi)存對(duì)齊不對(duì)齊還需要你來(lái)管嗎?這個(gè)在寫(xiě)程序的時(shí)候也是有講究的,那么到底什么是內(nèi)存對(duì)齊?為什么要有這個(gè)概念呢,我們來(lái)一起學(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)存讀寫(xiě)操作,沒(méi)有內(nèi)存對(duì)齊的問(wèn)題。從處理器硬件的角度,處理器更適合處理對(duì)齊的內(nèi)存操作。對(duì)于非對(duì)齊的內(nèi)存操作,不同的處理器則有不同的結(jié)果。

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

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

我們?cè)賮?lái)說(shuō)說(shuō)常糾結(jié)或者容易迷惑的結(jié)構(gòu)體成員的對(duì)齊問(wèn)題。

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

    關(guān)注

    5199

    文章

    20454

    瀏覽量

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

    關(guān)注

    183

    文章

    7644

    瀏覽量

    145639

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    嵌入式驅(qū)動(dòng)開(kāi)發(fā),需要掌握哪些技能?

    有經(jīng)驗(yàn)的老司機(jī)都知道,做嵌入式驅(qū)動(dòng)開(kāi)發(fā)需要掌握一系列的技能,包含編程、硬件、操作系統(tǒng)、調(diào)試等多個(gè)方面。 1、硬件知識(shí)熟悉原理圖:能看懂原理圖以及各種元器件的含義,以及PCB布局等。 了解
    發(fā)表于 01-20 16:46

    什么是嵌入式應(yīng)用開(kāi)發(fā)?

    包括ARM7、ARM9、ARM11、PowerPC、MIPS等。這些處理器和編程語(yǔ)言的選擇取決于具體的硬件條件和開(kāi)發(fā)需求?。 綜上所述,嵌入式應(yīng)用開(kāi)發(fā)是一個(gè)綜合性的技術(shù)領(lǐng)域,涉及硬件和軟件的緊密結(jié)合,廣泛應(yīng)用于各種設(shè)備和系統(tǒng)
    發(fā)表于 01-12 16:13

    C語(yǔ)言嵌入式系統(tǒng)編程注意事項(xiàng)-內(nèi)存操作

    C語(yǔ)言嵌入式系統(tǒng)編程注意事項(xiàng)之內(nèi)存操作 在嵌入式系統(tǒng)編程中,常常要求在特定的
    發(fā)表于 01-04 07:31

    嵌入式系統(tǒng)中,動(dòng)態(tài)分配內(nèi)存可能發(fā)生的問(wèn)題是什么?

    盡管不像非嵌入式計(jì)算機(jī)那么常見(jiàn),嵌入式系統(tǒng)還是有從堆(heap)中動(dòng)態(tài)分配內(nèi)存的過(guò)程的。 那么嵌入式
    發(fā)表于 12-22 09:42

    嵌入式應(yīng)掌握的幾種能力

    1. 編程語(yǔ)言 基本掌握嵌入式必備的編程語(yǔ)言。C語(yǔ)言為主,C++為輔。在資源有限的情況下,大多數(shù)嵌入式產(chǎn)品還是使用C語(yǔ)言為主的,特別是底層驅(qū)動(dòng)開(kāi)發(fā)。上層應(yīng)用開(kāi)發(fā)大多用C,在一些資源比
    發(fā)表于 12-08 06:05

    嵌入式和FPGA的區(qū)別

    ,F(xiàn)PGA憑借硬件并行處理能力,能夠?qū)崿F(xiàn)納秒級(jí)響應(yīng),遠(yuǎn)優(yōu)于微秒級(jí)的嵌入式系統(tǒng)。 功耗效率上,嵌入式系統(tǒng)針對(duì)特定應(yīng)用優(yōu)化后能效比很高,而FPGA由于可
    發(fā)表于 11-19 06:55

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

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

    嵌入式開(kāi)發(fā)的關(guān)鍵點(diǎn)介紹

    嵌入式開(kāi)發(fā)在現(xiàn)代科技中扮演著非常重要的角色。隨著物聯(lián)網(wǎng)的發(fā)展,嵌入式系統(tǒng)的需求也越來(lái)越大。嵌入式開(kāi)發(fā)不僅需要開(kāi)發(fā)人員具備深入的硬件知識(shí)和編程
    發(fā)表于 11-13 08:12

    嵌入式實(shí)時(shí)操作系統(tǒng)的特點(diǎn)

    操作系統(tǒng)具備高效的中斷處理機(jī)制,能夠快速響應(yīng)和處理系統(tǒng)的中斷事件。 資源管理:實(shí)時(shí)嵌入式操作系統(tǒng)提供有效的資源管理機(jī)制,包括內(nèi)存管理、設(shè)備驅(qū)
    發(fā)表于 11-13 06:30

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

    : 1)C語(yǔ)言與底層編程 核心地位:C語(yǔ)言是嵌入式開(kāi)發(fā)的基石,需精通指針操作、內(nèi)存管理、位運(yùn)算,直接操控硬件資源。 延伸技能:C++用于復(fù)雜項(xiàng)目架構(gòu)設(shè)計(jì),匯編語(yǔ)言?xún)?yōu)化底層性能(如啟動(dòng)代碼、中斷處理
    發(fā)表于 10-21 16:25

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

    知識(shí): 一、C/C++編程C/C++是嵌入式系統(tǒng)開(kāi)發(fā)中最常用的編程語(yǔ)言。熟練掌握C/C++語(yǔ)言將使你能夠理解和編寫(xiě)底層驅(qū)動(dòng)程序、操作系統(tǒng)
    發(fā)表于 08-06 10:34

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

    : 單片機(jī)嵌入式 :開(kāi)發(fā)環(huán)境相對(duì)簡(jiǎn)單,通常使用C語(yǔ)言或匯編語(yǔ)言進(jìn)行編程,開(kāi)發(fā)工具包括Keil、IAR等。 Linux嵌入式 :開(kāi)發(fā)環(huán)境較為復(fù)雜,除了需要掌握C語(yǔ)言,還需要了解Linux操作
    發(fā)表于 06-20 09:46

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

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

    嵌入式編程設(shè)計(jì)模式

    嵌入式編程設(shè)計(jì)模式,介紹如何使用設(shè)計(jì)模式為嵌入式系統(tǒng)創(chuàng)建高效且優(yōu)化的C語(yǔ)言設(shè)計(jì)。 純分享貼,有需要可以直接下載附件獲取完整資料! (如果內(nèi)容有幫助可以關(guān)注、點(diǎn)贊、評(píng)論支持一下哦~
    發(fā)表于 04-15 14:47

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

    在于對(duì)內(nèi)存的極致操控。結(jié)構(gòu)體構(gòu)建數(shù)據(jù)實(shí)體,聯(lián)合體實(shí)現(xiàn)內(nèi)存復(fù)用,二者的組合使用能創(chuàng)造出強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)。掌握它們的底層原理,配合內(nèi)存分析工具(如Valgrind、GDB),將助你在嵌入式開(kāi)
    發(fā)表于 04-08 09:18