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

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)用。

入門實(shí)例聲明一個聯(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;

使用成員運(yùn)算符(。),我們可以訪問“ 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í),都需要通過兩個設(shè)備之間的通信鏈路傳輸9字節(jié)的數(shù)據(jù)幀。圖2描繪了“設(shè)備A”用來存儲變量和需要通過通信鏈接的數(shù)據(jù)幀的結(jié)構(gòu)。


圖2
但是,讓我們考慮另一種情況,我們僅偶爾需要發(fā)送狀態(tài)信息。另外,假設(shè)沒有必要在給定時(shí)間同時(shí)獲取位置和速度信息。換句話說,有時(shí)我們僅發(fā)送位置,有時(shí)僅發(fā)送速度,有時(shí)僅發(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é)省通信帶寬有時(shí)甚至比節(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”表示“速度”消息。現(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àn)槲覀優(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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評論

    相關(guān)推薦

    為什么嵌入式驅(qū)動開發(fā)工程師可以拿高薪?

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

    哪些專業(yè)適合學(xué)習(xí)嵌入式開發(fā)?

    市場的80%以上,那什么專業(yè)能夠輕松轉(zhuǎn)行呢? 1)計(jì)算機(jī)科學(xué)與技術(shù):作為基礎(chǔ)學(xué)科,計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)提供了編程、算法、數(shù)據(jù)結(jié)構(gòu)等基礎(chǔ)知識,適合轉(zhuǎn)行到嵌入式、人工智能和物聯(lián)網(wǎng)領(lǐng)域。 2)電子信息工程
    發(fā)表于 01-03 13:44

    新手怎么學(xué)嵌入式?

    的運(yùn)行機(jī)制。例如,了解數(shù)據(jù)結(jié)構(gòu)中的鏈表、棧和隊(duì)列,對于在嵌入式編程中管理數(shù)據(jù)非常有幫助。 2. 選擇合適的編程
    發(fā)表于 12-12 10:51

    一文了解嵌入式軟件開發(fā)的對象

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

    零基礎(chǔ)嵌入式開發(fā)學(xué)習(xí)路線

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

    嵌入式學(xué)習(xí)建議

    原理的嵌入式操作系統(tǒng)進(jìn)行學(xué)習(xí)。不要一開始就學(xué)習(xí)幾種操作系統(tǒng),理解了基本原理,實(shí)踐中確有實(shí)際需要再學(xué)習(xí)也不遲。人總是要不斷學(xué)習(xí)的。 ⑨關(guān)于匯
    發(fā)表于 10-22 11:41

    嵌入式系統(tǒng)怎么學(xué)?

    一系列課程和技術(shù),包括但不限于以下內(nèi)容: 1、基礎(chǔ)知識:學(xué)習(xí)計(jì)算機(jī)組成原理、數(shù)字電路、模擬電路等基礎(chǔ)知識,建立對計(jì)算機(jī)硬件的認(rèn)知與理解。 2、編程語言:掌握至少一種嵌入式系統(tǒng)常用的
    發(fā)表于 07-02 10:10

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

    其他硬件的數(shù)據(jù)手冊,了解其特性和編程接口。 6. 學(xué)習(xí)低級編程嵌入式
    發(fā)表于 06-21 10:01

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

    相關(guān)教材、參加在線課程或者參考編程書籍來系統(tǒng)地學(xué)習(xí)C語言的基礎(chǔ)知識,并通過編寫簡單的程序進(jìn)行實(shí)踐。 二、深入了解
    發(fā)表于 04-07 16:03

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

    相關(guān)教材、參加在線課程或者參考編程書籍來系統(tǒng)地學(xué)習(xí)C語言的基礎(chǔ)知識,并通過編寫簡單的程序進(jìn)行實(shí)踐。 二、深入了解
    發(fā)表于 03-25 14:12

    嵌入式工程師需要掌握哪些技術(shù)?

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

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

    操作系統(tǒng)使用及C高級編程 數(shù)據(jù)結(jié)構(gòu)與算法 二:嵌入式Linux應(yīng)用工程師,Linux網(wǎng)絡(luò)開發(fā)工程師 文件IO 并發(fā)程序設(shè)計(jì) 項(xiàng)目實(shí)戰(zhàn):基于Linux的Flappybird游戲開發(fā) 網(wǎng)絡(luò)
    發(fā)表于 02-26 10:17

    嵌入式軟件開發(fā)應(yīng)該掌握哪些知識?

    掌握的知識 1.基礎(chǔ)知識 1.1 c/c++編程語言和數(shù)據(jù)結(jié)構(gòu) C/C++ 是
    發(fā)表于 02-19 11:23

    c語言,c++,java,python區(qū)別

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

    嵌入式學(xué)習(xí)步驟

    開發(fā)。 嵌入式學(xué)習(xí)步驟總結(jié)如下: (1).確定目標(biāo)平臺:選擇適合您要開發(fā)的嵌入式系統(tǒng)的硬件平臺。這取決于您要控制的設(shè)備以及您需要執(zhí)行的任務(wù)。 (2).選擇編程
    發(fā)表于 02-02 15:24
    主站蜘蛛池模板: 国产成人拍精品免费视频爱情岛 | 欧美ⅹxxxx18性欧美 | 理论片午午伦夜理片影院 | 亚洲免费精品视频 | 少妇两个奶头喷出奶水了怎么办 | 欧美人成人亚洲专区中文字幕 | 狠狠插影院 | 成人免费观看国产高清 | 欧美A级肉欲大片XXX | 色婷婷综合激情中文在线 | 中文字幕亚洲男人的天堂网络 | 一本色道久久88加勒比—综合 | 俄罗斯bbbbbbbbb大片 | 99精品欧美一区二区三区美图 | 亚洲一区二区三不卡高清 | 亚洲精品第一国产综合 | 日本黄色成年人免费观看 | 一本久道久久综合婷婷五月 | 天天操人人射 | 办公室日本肉丝OL在线 | 精品高潮呻吟99AV无码 | 青青草原免费在线 | 97在线精品视频免费 | 亚洲精品无码午夜福利在线观看 | 野花韩国高清完整版在线观看5 | 人妻兽虐曲| 添加一点爱与你电视剧免费观看 | 日韩欧美亚洲精品综合在线 | 在教室做啊好大用力 | 国产伦精品一区二区三区精品 | 日本久久不射 | 99国产精品久久人妻 | 亚洲国产成人精品不卡青青草原 | 久久婷婷五月免费综合色啪 | 大桥未久电影在线观看 | 大地影院日本韩国电影免费观看 | 男人桶女人j的视频在线观看 | 色丁香婷婷综合缴情综 | 99re6在线视频国产精品欧美 | 天美传媒在线观看免费完整版 | 蜜芽视频在线观看视频免费播放 |