chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

學(xué)習(xí)嵌入式C編程語言:了解聯(lián)合數(shù)據(jù)對象

嵌入式星球 ? 2020-09-28 09:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式C中struct與union的區(qū)別

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

入門實例聲明一個聯(lián)合就像聲明一個結(jié)構(gòu)。我們只需要將關(guān)鍵字“ struct”替換為“ union”即可??紤]以下示例代碼:
uniontest{
uint8_tc;
uint32_ti;
};

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

現(xiàn)在,我們可以創(chuàng)建該聯(lián)合模板的變量:

uniontestu1;

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

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

我們需要共享的內(nèi)存空間嗎?
讓我們看一個示例,其中聯(lián)合可以是有用的數(shù)據(jù)對象。假定,如下圖1所示,系統(tǒng)中有兩個設(shè)備需要相互通信。


圖1

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

表.png

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

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


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

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

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


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

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

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

struct{
uint8_tpower;
unit8_top_mode;
uint8_ttemp;
}status;

struct{
uint16_tx_pos;
unit16_ty_pos;
}position;

現(xiàn)在,我們可以將這些結(jié)構(gòu)與“ vel”變量一起放在一個并集中:

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

struct{
uint16_tx_pos;
unit16_ty_pos;
}position;

uint16_tvel;

}msg_union;

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

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

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

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

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”表示“狀態(tài)”消息,“ p”表示“位置”消息,“ v”表示“速度”消息?,F(xiàn)在,我們可以將“消息”結(jié)構(gòu)發(fā)送到“設(shè)備B”,并使用“ msg_type”變量的值作為消息類型的指示符。例如,如果接收到的“ msg_type”的值為“ p”,則“設(shè)備B”將知道共享內(nèi)存空間包含兩個2字節(jié)變量。

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

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

同樣,我們將需要有一個變量“ msg_type”來指定通信鏈路的發(fā)送器和接收器端的消息類型。例如,如果“設(shè)備A”需要發(fā)送位置消息,它將“ msg_type”設(shè)置為“ p”并分配四個字節(jié)的存儲空間來存儲“ x_pos”和“ y_pos”變量。接收器將檢查“ msg_type”的值,并根據(jù)其值創(chuàng)建適當(dāng)?shù)拇鎯臻g以存儲和解釋傳入的數(shù)據(jù)幀。

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


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

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

    嵌入式單片機(jī)開發(fā)學(xué)習(xí)路徑

    學(xué)習(xí)C語言 C語言嵌入式開發(fā)的基礎(chǔ)。掌握C
    發(fā)表于 02-09 15:42

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

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

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

    1. 編程語言 基本掌握嵌入式必備的編程語言。C語言
    發(fā)表于 12-08 06:05

    分享一個嵌入式開發(fā)學(xué)習(xí)路線

    如果你想要學(xué)習(xí)嵌入式開發(fā),我建議按照這個學(xué)習(xí)路線準(zhǔn)備: 1. 基礎(chǔ)鋪墊期(1-2個月) 理解嵌入式系統(tǒng)的“硬件基礎(chǔ)”和“編程入門”,能看懂
    發(fā)表于 12-04 11:01

    CW32嵌入式軟件開發(fā)的必備知識

    嵌入式軟件開發(fā)作為計算機(jī)科學(xué)和電子工程的交叉領(lǐng)域,要求開發(fā)人員具備一系列的專業(yè)知識和技能。 而基于CW32的嵌入式軟件開發(fā)必備知識包括以下部分: 1 、編程語言 熟練掌握
    發(fā)表于 11-28 07:48

    C語言嵌入式開發(fā)中的應(yīng)用

    C 語言可以利用 Socket 編程等技術(shù),實現(xiàn)嵌入式設(shè)備與服務(wù)器之間的 TCP/IP 通信,確保數(shù)據(jù)的可靠傳輸。同時,
    發(fā)表于 11-21 08:09

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

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

    C語言是否會阻礙嵌入式的發(fā)展?

    門老朋友:C語言。電子工業(yè)已經(jīng)走過了50多年,而C語言仍然是超過六成嵌入式項目的首選。它驅(qū)動著全球數(shù)以億計,甚至以萬億計的設(shè)備。但它的統(tǒng)治地
    的頭像 發(fā)表于 11-14 10:27 ?360次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>是否會阻礙<b class='flag-5'>嵌入式</b>的發(fā)展?

    一文了解Mojo編程語言

    ,利用硬件加速提升效率。 科學(xué)計算與數(shù)據(jù)處理 高效處理大規(guī)模數(shù)值分析、基因組學(xué)數(shù)據(jù)等任務(wù)。 系統(tǒng)工具開發(fā) 開發(fā)操作系統(tǒng)級工具,結(jié)合 Python 的便捷性和 C 的性能優(yōu)勢。 嵌入式
    發(fā)表于 11-07 05:59

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

    嵌入式需要掌握哪些核心技能? 若想通過學(xué)習(xí)嵌入式技術(shù)提升就業(yè)競爭力,需重點掌握C語言、嵌入式
    發(fā)表于 10-21 16:25

    盤點嵌入式就業(yè)所需要的技能有哪些?

    ,把握未來的職業(yè)機(jī)遇。 1.智能汽車行業(yè): - 熟悉嵌入式編程語言,如C/C++、Python等。 - 掌握
    發(fā)表于 08-11 15:43

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

    知識: 一、C/C++編程C/C++是嵌入式系統(tǒng)開發(fā)中最常用的
    發(fā)表于 08-06 10:34

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

    特定功能的計算機(jī)系統(tǒng),廣泛應(yīng)用于智能家居、工業(yè)控制、醫(yī)療設(shè)備、車載系統(tǒng)等領(lǐng)域。 2. 學(xué)習(xí)嵌入式開發(fā)的前置知識熟悉C語言編程掌握基本的
    發(fā)表于 05-15 09:29

    入行嵌入式難度大不大?

    入行嵌入式難度大不大?根據(jù)不同的情況來分析下。 (一)零基礎(chǔ)入行 對于零基礎(chǔ)的初學(xué)者來說,嵌入式領(lǐng)域可能會有一定的門檻。需要從基礎(chǔ)的電子電路知識、編程語言(如
    發(fā)表于 04-17 10:14

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

    嵌入式編程設(shè)計模式,介紹如何使用設(shè)計模式為嵌入式系統(tǒng)創(chuàng)建高效且優(yōu)化的C語言設(shè)計。 純分享貼,有需要可以直接下載附件獲取完整資料! (如
    發(fā)表于 04-15 14:47