色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

結構體對齊在STM32中的具體體現和如何進行不同對齊方式的設置

玩轉單片機與嵌入式 ? 來源:玩轉單片機與嵌入式 ? 2023-08-22 09:31 ? 次閱讀

引言

嵌入式系統開發中,結構體作為一種常見的數據組織方式,在內存中的布局方式對于程序性能和內存占用具有重要影響。本文將深入探討單片機C語言中的結構體對齊原理、重要性以及不同的對齊方式,并通過示例演示結構體對齊如何影響內存占用、訪問性能以及傳輸與存儲。同時,我們將關注STM32這樣的嵌入式系統,討論結構體對齊在STM32中的具體體現和如何進行不同對齊方式的設置。

結構體對齊原理

1、為什么需要對齊?

在計算機內存中,數據的存儲通常需要按照一定規則進行,這被稱為內存對齊。內存對齊的目的是為了提高訪問數據的效率,特別是對于硬件平臺而言。不同的處理器架構可能有不同的對齊要求。

2、不同的對齊方式

單字節對齊(Byte Alignment):每個數據類型從內存的任意地址開始存儲,不需要對齊到特定字節邊界。

雙字節對齊(Half-Word Alignment):數據類型的變量必須從內存的偶數地址開始存儲,即地址必須是2的倍數。

四字節對齊(Word Alignment):數據類型的變量必須從內存的4字節邊界開始存儲,即地址必須是4的倍數。

3、結構體對齊示例

下面的C代碼示例演示了不同對齊方式在內存中如何存儲一個簡單的結構體。

#include 


// 結構體定義
struct Example {
    char a;
    int b;
    char c;
};


int main() {
    struct Example e;


    // 計算各成員的地址
    printf("Address of a: %p
", &e.a);
    printf("Address of b: %p
", &e.b);
    printf("Address of c: %p
", &e.c);


    return 0;
}

在這個示例中,我們定義了一個名為Example的結構體,包含一個字符a、一個整數b和一個字符c。通過printf語句,我們可以查看不同對齊方式下各成員的地址。該結構體在內存中存儲的方式如下:

9526646a-4077-11ee-ac96-dac502259ad0.png

喜歡的讀者可以自行打印確定printf的輸出結果,觀察不同的地址有何規律。

4、結構體對齊的影響

(1)內存占用

結構體對齊可以影響內存的占用情況。考慮以下示例:

struct Example1 {
    char a;
    int b;
    char c;
};


struct Example2 {
    char a;
    char b;
    char c;
};

在示例1中,int類型需要四字節對齊,因此struct Example1的大小為12字節。而在示例2中,所有成員都是字符類型,無需對齊,因此struct Example2的大小為3字節。這突顯了對齊規則如何影響內存占用。

(2)訪問性能

結構體對齊還會影響訪問性能。在訪問一個結構體變量的成員時,如果成員沒有正確對齊,可能需要多次內存訪問操作,從而降低了訪問速度。合適的對齊可以減少內存訪問次數,提高程序性能。

(3)傳輸和存儲

結構體對齊也會影響數據的傳輸和存儲。當結構體作為數據包進行傳輸時,如果接收端和發送端的對齊方式不一致,可能需要進行字節序轉換,以確保數據的正確傳輸。

這增加了編程的復雜性,因為程序員需要處理不同對齊方式可能導致的字節序問題。

下面是一個傳輸和存儲的C代碼示例,演示了在不同對齊方式下數據的傳輸和存儲:

#include 
#include 


// 結構體定義
struct SensorData {
    uint16_t sensor1;
    uint32_t sensor2;
} __attribute__((packed));  // 使用編譯器指令取消結構體對齊


int main() {
    struct SensorData data;
    data.sensor1 = 0x1234;
    data.sensor2 = 0x56789ABC;


    // 數據存儲到內存中
    uint8_t buffer[sizeof(struct SensorData)];
    memcpy(buffer, &data, sizeof(struct SensorData));


    // 模擬傳輸過程
    // 接收端假設數據是按照雙字節對齊方式接收
    struct SensorData* receivedData = (struct SensorData*)buffer;


    printf("Received sensor1: 0x%04X
", receivedData->sensor1);
    printf("Received sensor2: 0x%08X
", receivedData->sensor2);


    return 0;
}

在這個示例中,我們定義了一個SensorData結構體,包含一個16位整數和一個32位整數。使用__attribute__((packed))編譯器指令取消了結構體對齊,以確保數據在內存中是連續存儲的。然后,我們將數據存儲到內存中,并模擬了傳輸過程。接收端假設數據是按照雙字節對齊方式接收,但由于我們取消了對齊,需要進行字節序轉換。

結構體對齊在STM32中的體現

1、外設寄存器對齊要求

在STM32這樣的嵌入式系統中,外設寄存器通常要求雙字節或四字節對齊,以確保寄存器的訪問性能和正確性。不滿足對齊要求可能導致未定義的行為或性能問題。

在STM32中,可以使用編譯器指令來實現對齊設置。例如,在Keil工程中,可以使用__align()指令來指定對齊方式。例如,要將一個結構體成員對齊到4字節邊界,可以這樣定義:

struct Example {
    char a;
    int b;
    char c;
} __attribute__((aligned(4)));

2、內存池分配

在嵌入式系統中,經常使用內存池來分配內存。內存池分配會確保分配的內存塊是按照對齊要求進行的,以滿足處理器的要求。這可以防止未對齊內存訪問,提高代碼的穩定性和可靠性。

在STM32中,常用的內存池分配庫如FreeRTOS提供了對齊設置的選項,以確保分配的內存塊滿足處理器的要求。

3、DMA操作

嵌入式系統中常常使用DMA(直接內存訪問)來進行數據傳輸。DMA操作通常要求數據緩沖區是雙字節或四字節對齊的。不滿足對齊要求可能導致DMA傳輸失敗或性能下降。

在STM32中,配置DMA時可以使用寄存器來設置數據對齊方式,以確保DMA傳輸的正確性和性能。

結論

作為嵌入式工程師的我們。在編寫代碼時,程序員需要根據目標硬件平臺的對齊要求。






審核編輯:劉清

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

    關注

    68

    文章

    19404

    瀏覽量

    230890
  • 單片機
    +關注

    關注

    6042

    文章

    44617

    瀏覽量

    637817
  • 存儲器
    +關注

    關注

    38

    文章

    7528

    瀏覽量

    164217
  • STM32
    +關注

    關注

    2271

    文章

    10923

    瀏覽量

    357178
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137482

原文標題:結構體對齊原理及在STM32中的設計原則和實現

文章出處:【微信號:玩轉單片機與嵌入式,微信公眾號:玩轉單片機與嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言結構對齊介紹

    大家好,我是嵌入式老林,從事嵌入式軟件開發多年,今天分享的內容是C語言結構對齊介紹,希望能對你有所幫助
    發表于 07-11 11:50 ?2576次閱讀
    C語言<b class='flag-5'>結構</b><b class='flag-5'>體</b><b class='flag-5'>對齊</b>介紹

    C語言-結構對齊詳解

    4字節對齊處存放,結構對齊后的大小必須4的倍數,如果編譯器設置為8字節對齊,則這里的4就是8。
    發表于 07-12 16:41

    CCS3.3 結構成員對齊

    : expected a type specifier error: expected a ";" 這個錯誤。是CCS3.3編譯器本身不支持__packed這種結構成員的對齊方式
    發表于 06-21 10:16

    請問ccs4.2 怎么設置結構的字節對齊

    請問ccs4.2 怎么設置結構的字節對齊,用于網絡數據發送的。是:]__attribute
    發表于 08-02 07:47

    請問z-stack結構默認對齊方式是一字節嗎?

    z-stack的結構默認對齊方式是一字節嗎?z-stack可以將一般指針強制轉換為
    發表于 08-18 07:38

    測試結構成員內存對齊方式方法

    //測試環境:keil for ARM//測試目的:通過keil仿真,介紹結構成員對齊方式 #pragma pack ()//定義一個聯合體類型 struct stru {int a
    發表于 12-21 07:37

    ARM內存邊界對齊以及sizeof問題

    默認情況下,32位cpu里,gcc對于結構對齊方式是按照四個字節來對齊的。
    發表于 06-16 11:10 ?2974次閱讀

    CSS對齊方式的詳細講解

    本文基于Html基礎,主要介紹了Html對齊方式,對于對齊的標簽做了詳細的講解,用豐富的案例 ,代碼效果圖的展示,幫助大家更好理解 。
    的頭像 發表于 12-24 15:38 ?1309次閱讀

    解析C語言結構字節如何對齊

    我們不使用宏#pragma pack,采用默認字節對齊方式。 先拋出結論: 一個結構第一個
    的頭像 發表于 06-12 17:42 ?3125次閱讀

    STM32 終極字節對齊解析

    字節對齊。uint64_t定義變量地址要8字節對齊。指針變量是4字節對齊。二、結構成員對齊問題
    發表于 11-23 18:06 ?11次下載
    <b class='flag-5'>STM32</b> 終極字節<b class='flag-5'>對齊</b>解析

    結構對齊理解上有點偏差

    總結一下: 結構對齊不再是簡單的字節個數的拼湊,而是要與內存地址進行掛鉤~一般我們也可以理解為內存地址分配是多少字節的倍數,就是多少直接對齊
    的頭像 發表于 08-10 18:08 ?1231次閱讀
    對<b class='flag-5'>結構</b><b class='flag-5'>體</b>的<b class='flag-5'>對齊</b>理解上有點偏差

    結構對齊為什么那么重要?

    以前我也沒覺得懂得這個結構對齊或者內存對齊有多重要,直到已經從事了嵌入式開發經驗不斷積累,才慢慢體會到,這是一種很基礎的知識,就因為這個東西不常用,而出現相關的問題是非常致命的,排查
    的頭像 發表于 04-03 10:13 ?1437次閱讀

    為什么要結構對齊?為什么結構對齊那么重要?

    C語言結構對齊問題,是面試必備問題。我參與招聘技術面試的時候,也喜歡問這個技術點。
    的頭像 發表于 05-26 14:10 ?1339次閱讀
    為什么要<b class='flag-5'>結構</b><b class='flag-5'>體</b><b class='flag-5'>對齊</b>?為什么<b class='flag-5'>結構</b><b class='flag-5'>體</b><b class='flag-5'>對齊</b>那么重要?

    keil arm工程結構1字節對齊如何實現

    的默認對齊方式和規則 結構Keil Arm工程的默認
    的頭像 發表于 01-05 14:40 ?4023次閱讀

    鴻蒙ArkUI開發:【彈性布局(主軸&amp;交叉軸對齊方式)】

    通過justifyContent參數設置主軸方向的對齊方式,和Row、Column的主軸對齊方式
    的頭像 發表于 05-14 15:33 ?806次閱讀
    鴻蒙ArkUI開發:【彈性布局(主軸&amp;交叉軸<b class='flag-5'>對齊</b><b class='flag-5'>方式</b>)】
    主站蜘蛛池模板: 成人毛片免费播放 | 色AV色婷婷97人妻久久久 | 一线高清视频在线播放 | 无码一区二区三区 | 亚洲 欧美 国产 视频二区 | 青青草原在线新免费 | 男女免费观看在线爽爽爽视频 | 麻豆国产MV视频 | 在线播放免费人成毛片视频 | 午夜福利试看120秒体验区 | 蓝男色gay| 拍戏被CAO翻了H | 久久欧洲AV无码精品色午夜麻豆 | 精品视频在线一区 | 免费99精品国产自在现线 | 亚洲国产精品嫩草影院 | 久久久WWW免费人成精品 | 国产传媒18精品A片在线观看 | 国产中文字幕乱码免费 | 国产99视频精品免费播放 | 久久中文字幕综合不卡一二区 | 达达兔午夜一级毛片 | 偷尝禁果H1V1幸运的山熊 | eussse手机电影在线观看 | 永久午夜福利视频一区在线观看 | 精品三级在线观看 | 国产国产乱老熟女视频网站97 | 久久精品AV无码亚洲色欲 | 亚洲欧美综合中文 | 久久成人免费大片 | 亚洲国产精品综合久久一线 | 国产亚洲欧美在线中文BT天堂网 | 精品成人片深夜 | 呜呜别塞了啊抽插 | 动漫女主被扒开双腿羞辱 | 成年人在线视频免费观看 | 国产精品高潮呻吟AV久久96 | 秋霞电影午夜伦午夜 | 午夜福利体验试看120秒 | 国产精品久久精品视 | 在线观看免费毛片 |