一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

uniontestu1;

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

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

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


圖1

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

表.png

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

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


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

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

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


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

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

對(duì)消息包使用聯(lián)合
讓我們看看如何使用聯(lián)合存儲(chǔ)上面示例的變量。我們有三種不同的消息類型:狀態(tài),位置和速度。我們可以為狀態(tài)和位置消息的變量創(chuàng)建一個(gè)結(jié)構(gòu)(以便將這些消息的變量分組并作為單個(gè)數(shù)據(jù)對(duì)象進(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”變量一起放在一個(gè)并集中:

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)部,有兩個(gè)結(jié)構(gòu)(“狀態(tài)”和“位置”)和一個(gè)兩個(gè)字節(jié)的變量(“ vel”)。此聯(lián)合的大小將等于其最大成員的大小,即“位置”結(jié)構(gòu),該結(jié)構(gòu)占用四個(gè)字節(jié)的內(nèi)存。此存儲(chǔ)空間在“狀態(tài)”,“位置”和“ vel”變量之間共享。

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

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

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

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

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

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

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

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


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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

    嵌入式適合自學(xué)嗎?

    基礎(chǔ)。對(duì)于初學(xué)者來說,很難在短時(shí)間內(nèi)建立起完整的知識(shí)體系。 2)學(xué)習(xí)曲線陡峭:嵌入式開發(fā)需要掌握多種編程語言、硬件知識(shí)、操作系統(tǒng)原理等,學(xué)習(xí)
    發(fā)表于 04-27 09:54

    入行嵌入式難度大不大?

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

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

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

    如何成為一名嵌入式軟件工程師?

    如何成為一名嵌入式軟件工程師? 01明確崗位的角色與定位 嵌入式軟件工程師主要負(fù)責(zé)開發(fā)運(yùn)行在特定硬件平臺(tái)上的軟件,這些軟件通常與硬件緊密集成,以實(shí)現(xiàn)特定的功能。 不僅需要精通編程語言
    發(fā)表于 04-15 14:37

    如何成為嵌入式開發(fā)工程師?

    和使用方法。- 掌握接口標(biāo)準(zhǔn)和總線協(xié)議,如UART、SPI、I2C、CAN等。 3. 編程能力:- 精通至少一種編程語言,尤其是C/
    發(fā)表于 02-19 10:39

    嵌入式機(jī)器學(xué)習(xí)的應(yīng)用特性與軟件開發(fā)環(huán)境

    作者:DigiKey Editor 在許多嵌入式系統(tǒng)中,必須采用嵌入式機(jī)器學(xué)習(xí)(Embedded Machine Learning)技術(shù),這是指將機(jī)器學(xué)習(xí)模型部署在資源受限的設(shè)備(如微
    的頭像 發(fā)表于 01-25 17:05 ?647次閱讀
    <b class='flag-5'>嵌入式</b>機(jī)器<b class='flag-5'>學(xué)習(xí)</b>的應(yīng)用特性與軟件開發(fā)環(huán)境

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

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

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

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

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

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

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

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

    MCU編程語言和開發(fā)環(huán)境介紹

    MCU編程語言 MCU編程語言是用于編寫MCU程序的高級(jí)編程語言,它們使得開發(fā)者能夠更高效地開
    的頭像 發(fā)表于 11-01 11:51 ?2169次閱讀

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

    嵌入式開發(fā)”沒有接觸過的同學(xué)可能會(huì)不明覺厲,但是只要你了解了,感興趣并且有一個(gè)正確的學(xué)習(xí)路線的話,零基礎(chǔ)也能入門。給大家介紹一個(gè)簡(jiǎn)單易懂的學(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

    嵌入式C編程常用的異常錯(cuò)誤處理

    嵌入式C編程中,異常錯(cuò)誤處理是確保系統(tǒng)穩(wěn)定性和可靠性的重要部分。以下是一些常見的異常錯(cuò)誤處理方法及其詳細(xì)說明和示例: 1. 斷言 (Assertions) 斷言用于在開發(fā)階段捕獲程序中的邏輯錯(cuò)誤
    發(fā)表于 08-06 14:32