女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

嵌入式系統編程的大小端和內存對齊問題

電子工程師 ? 來源:張飛實戰電子 ? 作者:黃忠老師 ? 2021-08-27 10:54 ? 次閱讀

C語言是一種高級語言,在大多數情況下C語言的代碼是和具體的處理器體系結構無關的。然而,在嵌入式系統編程中,有可能涉及對內存的具體操作。在大小端和內存對齊問題上,C語言就不能屏蔽不同體系結構處理器的差別,也就是說同樣的C語言代碼在不同的體系結構的處理器上,有可能產生不同的結果。

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

如果讀寫指令針對的數據長度和類型是一致的,無論數據在內存中存放的形式如何,處理器整體讀寫都沒有問題。這種整內存協調的讀寫操作問題,一般不會涉及處理器的大小端。

當處理器讀寫指令針對的數據長度不一致的時候就會涉及大小端的問題,例如:

將0x76543210整體放入內存,然后在內存的首地址用單字節讀取的命令讀出。

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

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

對于小端處理器,寫內存的時候會將內存低地址處放入源數據的低字節,在內存的高地址處放入源數據的高字節;讀內存的時候,將內存中低地址的數據就視為目標數據的低字節,對應的高地址數據是目標數據的高字節。

對于大端處理器,跟小端就相反的。內存低地址存放數據的高字節,高地址存放數據的低字節。

上面的示例只是處理器自身讀取和寫入內存的情況,在更多的情況下,內存中的數據可能來自外界的輸入,例如:來自網絡的數據包;處理器在寫內存的時候,這塊內存也可能是給系統中別的設備使用的,例如:處理器寫顯示內存的情況。這時,就更需要注意處理器的大小端問題,只有大小端處理協調匹配,才能獲得正確的結果。

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

上面我們說了一下內存讀寫的模式不同,一個地址存的數據不同。

接下來我們說一下內存對齊的問題,有人會說了內存對齊不對齊還需要你來管嗎?這個在寫程序的時候也是有講究的,那么到底什么是內存對齊?為什么要有這個概念呢,我們來一起學習一下吧。

內存對齊操作的含義是:對于一個4字節的數據,要求其內存是4字節對齊的(地址為4字節的整數倍)。32位對齊的含義是其內存的地址的最低位是:0x0,0x4,0x8,0xC

16位對齊的含義是其內存的地址的最低位是:0x0,0x2,0x4,0x6,0x8,0xA,0xC,0xE

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

局部變量建立在棧空間上的,由編譯器分配,一般保證它們都是對齊的。但是在程序中可能出現不對齊的內存操作。對于嵌入式系統中常用的ARM體系結構,并不支持不對齊的地址操作,當進行不對齊的地址訪問的時候,處理器將引發異常。

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

我們再來說說常糾結或者容易迷惑的結構體成員的對齊問題。

結構體是一個基本的語法單元。在32位系統中,編譯器一般會對結構體的成員變量作一定的對齊處理。例如,在程序中定義如下結構體:

typedef struct _S1

{

char m1;

int m2;

char m3;

short m4;

}S1;

在結構體的定義上,結構體的大小應該是各個結構體成員的大小之和。但是,對于上面這個結構體S1,它的大小并不等于4個成員變量之和。在這種定義中,三個成員變量之和是1+4+2+2=8,但是結構體的大小并不是8字節。

編譯器在處理結構體的時候,默認將結構體內部各個變量的內存都是對齊的,由此在結構體的內部可能出現一些空的字節。

一般情況下,在結構體含有4字節長整型成員的時候,結構體的大小將是4字節的倍數。為了對齊可能需要在結構體的最后補充1~3個字節。

如果結構體中含有2字節短整型成員的時候,結構體的大小將是2字節的倍數。為了對齊可能需要在結構體的最后補充一個字節。

這個算字節數的一般出現在找工作中的筆試題的概率還是很高的,其實就是考察的對這個內存對齊的掌握。

責任編輯:haq

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

    關注

    5141

    文章

    19526

    瀏覽量

    314861
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140264

原文標題:在嵌入式系統中大小端和對齊問題

文章出處:【微信號:CanaanTech,微信公眾號:嘉楠科技】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    嵌入式開發入門指南:從零開始學習嵌入式

    特定功能的計算機系統,廣泛應用于智能家居、工業控制、醫療設備、車載系統等領域。 2. 學習嵌入式開發的前置知識熟悉C語言編程掌握基本的數據結構與算法了解數字電路與微控制器原理熟悉Lin
    發表于 05-15 09:29

    嵌入式編程設計模式

    嵌入式編程設計模式,介紹如何使用設計模式為嵌入式系統創建高效且優化的C語言設計。 純分享貼,有需要可以直接下載附件獲取完整資料! (如果內容有幫助可以關注、點贊、評論支持一下哦~
    發表于 04-15 14:47

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

    在于對內存的極致操控。結構體構建數據實體,聯合體實現內存復用,二者的組合使用能創造出強大的數據結構。掌握它們的底層原理,配合內存分析工具(如Valgrind、GDB),將助你在嵌入式
    發表于 04-08 09:18

    嵌入式主板的概述與發展

    未來發展趨勢進行深入探討。嵌入式主板的基本概念嵌入式主板是指為嵌入式系統設計的電路板,它通常集成了微處理器、內存、輸入輸出接口等關鍵組件。與
    的頭像 發表于 01-13 16:30 ?675次閱讀
    <b class='flag-5'>嵌入式</b>主板的概述與發展

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

    場景下可以提供額外的優勢。 熟練使用C/C++進行嵌入式系統編程,便于理解內存管理、指針、數據結構等高級特性。 3)項目實踐: 通過動手做項目來積累經驗,這是嵌入式工作經驗積累的重要
    發表于 01-07 16:56

    新手怎么學嵌入式?

    嵌入式系統的發展,嵌入式操作系統也變得越來越重要。學習嵌入式操作系統可以幫助你更好地管理
    發表于 12-12 10:51

    嵌入式系統開發與硬件的關系 嵌入式系統開發常見問題解決

    系統開發與硬件關系的幾個關鍵點: 硬件依賴性 :嵌入式系統的軟件必須能夠在特定的硬件上運行,這包括處理器、內存、輸入/輸出接口等。軟件必須能夠充分利用硬件的特性,同時繞過其限制。 資源
    的頭像 發表于 12-09 09:38 ?829次閱讀

    ARM嵌入式系統內存對齊的重要性

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

    嵌入式系統與物聯網的結合

    隨著科技的飛速發展,嵌入式系統和物聯網(IoT)已經成為現代技術領域的重要組成部分。嵌入式系統是指嵌入到設備或
    的頭像 發表于 11-06 10:23 ?952次閱讀

    嵌入式 Linux 操作系統配置

    隨著物聯網(IoT)和智能設備的快速發展,嵌入式系統在各個領域扮演著越來越重要的角色。Linux因其開源、靈活和穩定的特性,成為嵌入式系統的首選操作
    的頭像 發表于 11-06 10:22 ?1097次閱讀

    嵌入式系統的原理和應用

    嵌入式系統是一種專用的計算機系統,其設計初衷是執行特定任務,而非作為通用計算機使用。這類系統通常作為更大系統的一部分,起到控制、監控或輔助的
    的頭像 發表于 10-05 17:03 ?1928次閱讀

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

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

    嵌入式系統怎么學?

    一系列課程和技術,包括但不限于以下內容: 1、基礎知識:學習計算機組成原理、數字電路、模擬電路等基礎知識,建立對計算機硬件的認知與理解。 2、編程語言:掌握至少一種嵌入式系統常用的編程
    發表于 07-02 10:10

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

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

    從事嵌入式方向,一定要軟硬件通吃?

    軟件工程師的職責嵌入式軟件工程師的主要職責是為嵌入式系統編寫和調試代碼,確保系統按預期工作。他們需要處理底層硬件接口、實時操作系統(RTOS
    的頭像 發表于 06-05 08:10 ?1666次閱讀
    從事<b class='flag-5'>嵌入式</b>方向,一定要軟硬件通吃?