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

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

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

3天內不再提示

學習嵌入式C編程語言:了解聯合數據對象

嵌入式星球 ? 2020-09-28 09:58 ? 次閱讀
嵌入式C中struct與union的區別

在本系列的上一篇文章中,我們討論了嵌入式C中的結構允許我們對不同數據類型的變量進行分組并將它們作為單個數據對象進行處理。
除了結構之外,C語言還支持另一個稱為聯合的數據結構,該結構可以將不同的數據類型組合為一個數據對象。本文將提供有關工會的一些基本信息。我們首先來看一個聲明并集的介紹性示例,然后研究該數據對象的重要應用。

入門實例聲明一個聯合就像聲明一個結構。我們只需要將關鍵字“ struct”替換為“ union”即可。考慮以下示例代碼:
uniontest{
uint8_tc;
uint32_ti;
};

這指定了一個模板,該模板具有兩個成員:“ c”(占用一個字節)和“ i”(占用四個字節)。

現在,我們可以創建該聯合模板的變量:

uniontestu1;

使用成員運算符(。),我們可以訪問“ u1”聯合的成員。例如,以下代碼將10分配給上述聯合的第二個成員,并將“ c”的值復制到“ m”變量(其類型必須為uint8_t)。
u1.i=10;
m=u1.c;

將分配多少存儲空間來存儲“ u1”變量?盡管結構的大小至少等于其成員的大小之和,但并集的大小等于其最大變量的大小。分配給工會的內存空間將在所有工會成員之間共享。在上面的示例中,“ u1”的大小等于uint32_t的大小,即四個字節。此存儲空間在“ i”和“ c”之間共享。因此,為這兩個成員之一分配值將更改另一個成員的值。
您可能想知道,“使用相同的內存空間來存儲多個變量有什么意義?此功能有什么應用程序?” 我們將在下一部分中探討此問題。

我們需要共享的內存空間嗎?
讓我們看一個示例,其中聯合可以是有用的數據對象。假定,如下圖1所示,系統中有兩個設備需要相互通信


圖1

“設備A”應將狀態,速度和位置信息發送到“設備B”。狀態信息由三個變量組成,這些變量指示電池電量,操作模式和環境溫度。該位置由兩個變量表示,這些變量顯示了x軸和y軸的位置。最后,速度由單個變量表示。假定這些變量的大小如下表所示。

表.png

如果“設備B”需要不斷獲取所有這些信息,我們可以將所有這些變量存儲在結構中,并將該結構發送到“設備B”。結構大小將至少等于這些變量的大小之和,即9個字節。

因此,每次“設備A”與“設備B”對話時,都需要通過兩個設備之間的通信鏈路傳輸9字節的數據幀。圖2描繪了“設備A”用來存儲變量和需要通過通信鏈接的數據幀的結構。


圖2
但是,讓我們考慮另一種情況,我們僅偶爾需要發送狀態信息。另外,假設沒有必要在給定時間同時獲取位置和速度信息。換句話說,有時我們僅發送位置,有時僅發送速度,有時僅發送狀態信息。在這種情況下,將信息存儲為9字節結構并通過通信鏈接進行傳輸似乎不是一個好主意。

狀態信息只能由三個字節表示。對于位置和速度,我們分別只需要四個和兩個字節。因此,“設備A”在一次傳輸中需要發送的最大字節數為4,因此,我們僅需要四個字節的內存即可存儲此信息。這四個字節的內存空間將在我們的三種消息類型之間共享(請參見圖3)。

此外,請注意,通過通信鏈路傳遞的數據幀的長度從九個字節減少到四個字節。


圖3
總而言之,如果我們的程序具有互斥的變量,我們可以將它們存儲在共享的內存區域中,以保留寶貴的內存空間。這可能很重要,尤其是在內存受限的嵌入式系統中。在這種情況下,我們可以使用聯合創建所需的共享內存空間。

上面的示例表明,使用聯合來處理互斥變量也可以幫助我們節省通信帶寬。節省通信帶寬有時甚至比節省內存更為重要。

對消息包使用聯合
讓我們看看如何使用聯合存儲上面示例的變量。我們有三種不同的消息類型:狀態,位置和速度。我們可以為狀態和位置消息的變量創建一個結構(以便將這些消息的變量分組并作為單個數據對象進行操作)。
以下結構用于此目的:

struct{
uint8_tpower;
unit8_top_mode;
uint8_ttemp;
}status;

struct{
uint16_tx_pos;
unit16_ty_pos;
}position;

現在,我們可以將這些結構與“ vel”變量一起放在一個并集中:

union{
struct{
uint8_tpower;
unit8_top_mode;
uint8_ttemp;
}status;

struct{
uint16_tx_pos;
unit16_ty_pos;
}position;

uint16_tvel;

}msg_union;

上面的代碼指定了聯合模板,并創建了該模板的變量(名為“ msg_union”)。在該聯合內部,有兩個結構(“狀態”和“位置”)和一個兩個字節的變量(“ vel”)。此聯合的大小將等于其最大成員的大小,即“位置”結構,該結構占用四個字節的內存。此存儲空間在“狀態”,“位置”和“ vel”變量之間共享。

如何跟蹤結構體活躍成員
我們可以使用上述聯合的共享內存空間來存儲我們的變量;但是,仍然存在一個問題:接收方應如何確定已發送哪種類型的消息?接收者需要識別消息類型才能成功解釋接收到的信息。例如,如果我們發送“位置”消息,則接收到的數據的所有四個字節都很重要,但是對于“速度”消息,僅應使用接收到的字節中的兩個。

要解決此問題,我們需要將聯合與另一個變量關聯,例如“ msg_type”,該變量指示消息類型(或最后寫入的聯合成員)。結合有離散值(表示該聯盟的活動成員)的聯合稱為“區分聯合”或“標記聯合”。

關于“ msg_type”變量的數據類型,我們可以使用C語言的枚舉數據類型來創建符號常量。但是,我們將使用字符來指定消息類型,只是為了使事情盡可能簡單:

struct{
uint8_tmsg_type;
union{
struct{
uint8_tpower;
unit8_top_mode;
uint8_ttemp;
}status;

struct{
uint16_tx_pos;
unit16_ty_pos;
}position;

uint16_tvel;

}msg_union;
}message;

我們可以為“ msg_type”變量考慮三個可能的值:“ s”表示“狀態”消息,“ p”表示“位置”消息,“ v”表示“速度”消息。現在,我們可以將“消息”結構發送到“設備B”,并使用“ msg_type”變量的值作為消息類型的指示符。例如,如果接收到的“ msg_type”的值為“ p”,則“設備B”將知道共享內存空間包含兩個2字節變量。

注意,由于我們需要傳遞“ msg_type”變量,因此必須在通過通信鏈接發送的數據幀中添加另一個字節。還請注意,使用此解決方案,接收者無需提前知道傳入的是哪種消息。

替代解決方案:動態內存分配
我們看到,并集使我們可以聲明一個共享內存區域,以節省內存空間和通信帶寬。但是,還有另一種存儲互斥變量的方法,例如上面的示例。第二種解決方案使用動態內存分配來存儲每種消息類型的變量。

同樣,我們將需要有一個變量“ msg_type”來指定通信鏈路的發送器和接收器端的消息類型。例如,如果“設備A”需要發送位置消息,它將“ msg_type”設置為“ p”并分配四個字節的存儲空間來存儲“ x_pos”和“ y_pos”變量。接收器將檢查“ msg_type”的值,并根據其值創建適當的存儲空間以存儲和解釋傳入的數據幀。

就內存使用而言,動態內存的使用會更有效,因為我們為每種消息類型分配的空間恰到好處。基于聯合的解決方案并非如此。在那里,我們有四個字節的共享內存來存儲所有三種消息類型,盡管“狀態”消息和“速度”消息分別僅需要三個字節和兩個字節。但是,動態內存分配可能會變慢,并且程序員需要包含釋放分配的內存的代碼。因此,程序員通常更喜歡使用基于聯合的解決方案。


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

    評論

    相關推薦

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

    。 這些基礎知識有助于更好地理解嵌入式系統的工作原理。 2)精通編程語言: 在嵌入式開發中,C語言
    發表于 01-07 16:56

    新手怎么學嵌入式?

    的運行機制。例如,了解數據結構中的鏈表、棧和隊列,對于在嵌入式編程中管理數據非常有幫助。 2. 選擇合適的編程
    發表于 12-12 10:51

    一文了解嵌入式軟件開發的對象

    以前應用場景很單一,嵌入式開發可能談不上面向對象開發。但現在,做嵌入式開發,沒有面向對象開發,你就有點落伍了。 本文結合個人經驗和周立功《抽象接口技術和組件開發規范及其思想》,循
    的頭像 發表于 11-15 10:31 ?389次閱讀
    一文<b class='flag-5'>了解</b><b class='flag-5'>嵌入式</b>軟件開發的<b class='flag-5'>對象</b>

    零基礎嵌入式開發學習路線

    嵌入式開發”沒有接觸過的同學可能會不明覺厲,但是只要你了解了,感興趣并且有一個正確的學習路線的話,零基礎也能入門。給大家介紹一個簡單易懂的學習路線,讓你能夠從零開始
    發表于 10-25 15:55

    嵌入式學習建議

    原理的嵌入式操作系統進行學習。不要一開始就學習幾種操作系統,理解了基本原理,實踐中確有實際需要再學習也不遲。人總是要不斷學習的。 ⑨關于匯
    發表于 10-22 11:41

    嵌入式系統怎么學?

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

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

    其他硬件的數據手冊,了解其特性和編程接口。 6. 學習低級編程嵌入式
    發表于 06-21 10:01

    如何成為一名嵌入式C語言高手?

    相關教材、參加在線課程或者參考編程書籍來系統地學習C語言的基礎知識,并通過編寫簡單的程序進行實踐。 二、深入了解
    發表于 04-07 16:03

    如何成為一名嵌入式C語言高手?

    相關教材、參加在線課程或者參考編程書籍來系統地學習C語言的基礎知識,并通過編寫簡單的程序進行實踐。 二、深入了解
    發表于 03-25 14:12

    嵌入式工程師需要掌握哪些技術?

    一些必要的技術能力是至關重要的。在本篇中,我們將討論入行嵌入式所必須的技術能力。 1.C/C++編程能力:C/
    發表于 03-04 16:38

    嵌入式人工智能的就業方向有哪些?

    操作系統使用及C高級編程 數據結構與算法 二:嵌入式Linux應用工程師,Linux網絡開發工程師 文件IO 并發程序設計 項目實戰:基于Linux的Flappybird游戲開發 網絡
    發表于 02-26 10:17

    嵌入式軟件開發應該掌握哪些知識?

    掌握的知識 1.基礎知識 1.1 c/c++編程語言和數據結構 C/C++ 是
    發表于 02-19 11:23

    c語言,c++,java,python區別

    操作系統、嵌入式系統等對性能要求較高的場景。C語言的語法相對簡單,學習曲線較平緩,也是學習其他高級語言
    的頭像 發表于 02-05 14:11 ?2508次閱讀

    嵌入式學習步驟

    開發。 嵌入式學習步驟總結如下: (1).確定目標平臺:選擇適合您要開發的嵌入式系統的硬件平臺。這取決于您要控制的設備以及您需要執行的任務。 (2).選擇編程
    發表于 02-02 15:24

    聊一聊嵌入式C語言

    作為一名嵌入式軟件開發者,熟練掌握嵌入式C語言對我的日常工作至關重要。
    的頭像 發表于 01-22 09:28 ?567次閱讀
    主站蜘蛛池模板: 亚洲欧美网| 日本三级在线观看免费| 在线观看h网站| 欧美性猛交xxxx免费| 欧美另类网| 午夜网站免费| 扒开末成年粉嫩的小缝强文| 中文字幕有码在线视频| 亚洲xx网| 日本高清中文字幕在线观穿线视频 | 日本三级日本三级日本三级极| 欧美一级片在线免费观看| 女的扒开尿口让男人桶| 老司机色网| 婷婷丁香亚洲| 欧美成人午夜精品免费福利 | 在线观看三级视频| 国产在线观看黄色| 热re66久久精品国产99热| 亚洲人成电影综合网站色| 日本三级最新中文字幕电影| 久久电影福利| 在线免费观看视频黄| 人人干干人人| 天天看天天爽天天摸天天添| 久久久www免费人成看片| 免费播放视频| 一级一片免费播放| 青草视频在线观看国产| 国产aaa级一级毛片| 国产无圣光高清一区二区| 久久视频免费看| 丁香婷婷基地| 欧美51| 精品亚洲大全| 国产精品偷伦费观看| 中国一级生活片| 亚洲免费在线观看视频| 亚洲va中文字幕| 免费一看一级毛片| 午夜免费伦费影视在线观看|