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

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

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

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

了解嵌入式C:什么是結(jié)構(gòu)?

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

掃碼添加小助手

加入工程師交流群

本文提供了有關嵌入式C編程中的結(jié)構(gòu)的一些基本信息。
在介紹了結(jié)構(gòu)之后,我們將看一下這個強大的數(shù)據(jù)對象的一些重要應用。然后,我們將檢查C語言語法以聲明結(jié)構(gòu)。最后,我們將簡要介紹數(shù)據(jù)對齊要求。我們將看到,通過簡單地重新排列其成員的順序,我們也許可以減小結(jié)構(gòu)的大小。

結(jié)構(gòu)體

邏輯上彼此相關的多個相同類型的變量可以分組為一個數(shù)組。在組上而不是自變量的集合上工作使我們可以整理數(shù)據(jù)并更方便地使用它。例如,我們可以定義以下數(shù)組來存儲將語音輸入數(shù)字化的ADC的最后50個樣本:

uint16_tvoice[50];

請注意,uint16_t是寬度為16位的無符號整數(shù)類型。這在C標準庫stdint.h中定義,該庫提供與系統(tǒng)規(guī)格無關的特定位長的數(shù)據(jù)類型。

數(shù)組可用于對同一數(shù)據(jù)類型的多個變量進行分組。如果不同數(shù)據(jù)類型的變量之間存在聯(lián)系怎么辦?我們可以在程序中將這些變量視為一組嗎?例如,假設我們需要指定 上面生成語音陣列的ADC的采樣率。我們可以定義一個float變量來存儲采樣率:

floatsample_rate;


盡管變量voicesample_rate彼此相關,但它們被定義為兩個獨立變量。為了使這兩個變量相互關聯(lián),我們可以使用稱為結(jié)構(gòu)的C語言強大的數(shù)據(jù)構(gòu)造。結(jié)構(gòu)允許我們將不同的數(shù)據(jù)類型分組,并將它們作為單個數(shù)據(jù)對象處理。一個結(jié)構(gòu)可以包括不同種類的變量類型,例如其他結(jié)構(gòu),指向函數(shù)的指針,指向結(jié)構(gòu)的指針等。對于語音示例,我們可以使用以下結(jié)構(gòu):

structrecord{
uint16_tvoice[50];
floatsample_rate;
};

在這種情況下,我們有一個稱為record的結(jié)構(gòu),該結(jié)構(gòu) 具有兩個不同的成員或字段:第一個成員是uint16_t元素的數(shù)組,第二個成員是float類型的變量。語法以關鍵字struct開頭。struct關鍵字后的單詞是一個可選名稱,用于以后引用該結(jié)構(gòu)。我們將在本文的其余部分中討論定義和使用結(jié)構(gòu)的其他細節(jié)。

為什么結(jié)構(gòu)很重要?


上面的示例指出了結(jié)構(gòu)的重要應用,即定義了可以將不同類型的各個變量相互關聯(lián)的依賴于應用的數(shù)據(jù)對象。這不僅導致處理數(shù)據(jù)的有效方式,而且使我們能夠?qū)崿F(xiàn)稱為數(shù)據(jù)結(jié)構(gòu)的專門結(jié)構(gòu)。
數(shù)據(jù)結(jié)構(gòu)可用于各種應用程序,例如兩個嵌入式系統(tǒng)之間的消息傳遞以及將從傳感器收集的數(shù)據(jù)存儲在不連續(xù)的內(nèi)存位置中。


圖1.結(jié)構(gòu)可用于實現(xiàn)鏈表。
此外,當程序需要訪問內(nèi)存映射的微控制器外圍設備的寄存器時,結(jié)構(gòu)是有用的數(shù)據(jù)對象。在下一篇文章中,我們將介紹結(jié)構(gòu)應用程序。


圖2.STM32MCU存儲器映射。圖片由帶ARM嵌入式系統(tǒng)提供。
聲明結(jié)構(gòu)

要使用結(jié)構(gòu),我們首先需要指定一個結(jié)構(gòu)模板??紤]下面的示例代碼:

structrecord{
uint16_tvoice[4];
floatsample_rate;
};

這指定了用于創(chuàng)建此類型的將來變量的布局或模板。該模板包括一個uint16_t數(shù)組和一個float類型的變量。模板的名稱為record,它位于關鍵字struct之后。值得一提的是,沒有用于存儲結(jié)構(gòu)模板的內(nèi)存分配。僅在定義了基于此布局的結(jié)構(gòu)變量之后,才進行內(nèi)存分配。以下代碼聲明 了上述模板的mic1變量:

structrecordmic1;

現(xiàn)在,為變量mic1分配了一部分內(nèi)存。它有空間存儲數(shù)組的四個uint16_t元素和一個float變量。

可以使用成員運算符(。)訪問結(jié)構(gòu)的成員。例如,以下代碼將100分配給數(shù)組的第一個元素,并將sample_rate的值復制到fs變量(該變量必須是float類型)。

mic1.voice[0]=100;
fs=mic1.sample_rate;


聲明結(jié)構(gòu)的其他方法
在上一節(jié)中,我們介紹了一種聲明結(jié)構(gòu)的方法。C語言支持其他一些格式,本節(jié)將進行介紹。在整個程序中,您可能會堅持使用一種格式,但有時可能會對其他格式有所幫助。

聲明結(jié)構(gòu)模板的一般語法為:

structtag_name{
type_1member_1;
type_2member_2;
…
type_nmember_n;

}variable_name;

TAG_NAME變量名是可選的標識符。通常,我們會至少看到這兩個標識符之一,但是在某些情況下,我們可以消除這兩個標識符。

語法1:當同時存在tag_namevariable_name時,我們在模板后面定義結(jié)構(gòu)變量。使用此語法,我們可以重寫以下示例:

structrecord{
uint16_tvoice[4];
floatsample_rate;
}mic1;

現(xiàn)在,如果我們需要定義另一個變量(mic2),我們可以編寫

structrecordmic2;

語法2:僅 包含variable_name。使用此語法,我們可以按以下方式重寫上一節(jié)中的示例:

struct{
uint16_tvoice[4];
floatsample_rate;
}mic1;

在這種情況下,我們必須在模板之后定義所有變量,而我們以后不能在程序中定義任何其他變量(因為模板沒有名稱,以后也不能引用它)。

語法3:在這種情況下,沒有tag_namevariable_name。以這種方式定義的結(jié)構(gòu)模板稱為匿名結(jié)構(gòu)??梢栽诹硪粋€結(jié)構(gòu)或聯(lián)合中定義匿名結(jié)構(gòu)。下面是一個示例:

structtest{
//Anonymousstructure
struct{
floatf;
chara;
};
}test_var;

要訪問上述匿名結(jié)構(gòu)的成員,我們可以使用成員運算符(。)。以下代碼將1.2分配給成員f。

test_var.f=1.2;

由于該結(jié)構(gòu)是匿名的,因此我們僅使用一次成員運算符訪問其成員。如果它的名稱如下面的示例所示,我們將不得不兩次使用成員運算符:

structtest{
struct{
floatf;
chara;
}nested;
}test_var;

在這種情況下,我們應該使用以下代碼將1.2分配給f

test_var.nested.f=1.2;

如您所見,匿名結(jié)構(gòu)可以使代碼更具可讀性,而又不那么冗長。也可以將typedef關鍵字與結(jié)構(gòu)一起使用以定義新的數(shù)據(jù)類型。我們將在以后的文章中介紹這種方法。

結(jié)構(gòu)的內(nèi)存布局


C標準保證結(jié)構(gòu)的成員將按照在結(jié)構(gòu)中聲明成員的順序一個接一個地位于內(nèi)存中。第一個成員的內(nèi)存地址將與結(jié)構(gòu)本身的地址相同??紤]以下示例:


將分配四個存儲位置來存儲變量c,d,e和f。內(nèi)存位置的順序?qū)⑴c聲明成員的順序匹配:c的位置將具有最低的地址,然后是d,e,最后出現(xiàn)f。我們需要多少字節(jié)來存儲此結(jié)構(gòu)?考慮到變量的大小,我們知道至少需要1 + 4 + 1 + 2 = 8個字節(jié)來存儲此結(jié)構(gòu)。但是,如果我們將此代碼編譯為32位計算機,則會令人驚訝地觀察到MyStruct的大小是12個字節(jié)而不是8個字節(jié)!這是由于以下事實:編譯器在為結(jié)構(gòu)的不同成員分配內(nèi)存時具有某些約束。例如,一個32位整數(shù)只能存儲在其地址可被4整除的內(nèi)存位置。實施這種約束,稱為數(shù)據(jù)對齊要求,以使處理器更有效地訪問變量。數(shù)據(jù)對齊會導致內(nèi)存布局浪費一些空間(或填充)。僅在這里介紹該主題。我們將在本系列的下一篇文章中詳細介紹。


圖3.數(shù)據(jù)對齊會導致內(nèi)存布局中的空間浪費(或填充)。
意識到數(shù)據(jù)對齊要求后,我們也許可以重新排列結(jié)構(gòu)中成員的順序,并使內(nèi)存使用效率更高。例如,如果我們按如下所示重寫上述結(jié)構(gòu),則在32位計算機上,其大小將減小為8個字節(jié)。

structTest2{
uint32_td;
uint16_tf;
uint8_tc;
uint8_te;
}MyStruct;

對于受內(nèi)存限制的嵌入式系統(tǒng),將數(shù)據(jù)對象的大小從12個字節(jié)減少到8個字節(jié)可節(jié)省大量資金,尤其是當程序需要許多此類數(shù)據(jù)對象時。
下一篇文章將更詳細地討論數(shù)據(jù)對齊,并研究在嵌入式系統(tǒng)中使用結(jié)構(gòu)的一些示例。

概要

  • 結(jié)構(gòu)允許我們定義依賴于應用程序的數(shù)據(jù)對象,這些對象可以將不同類型的各個變量相互關聯(lián)。這導致了一種有效的數(shù)據(jù)處理方法。

  • 稱為數(shù)據(jù)結(jié)構(gòu)的專用結(jié)構(gòu)可用于各種應用程序,例如兩個嵌入式系統(tǒng)之間的消息傳遞以及將從傳感器收集的數(shù)據(jù)存儲在不連續(xù)的內(nèi)存位置中。

  • 當我們需要訪問存儲器映射的微控制器外設的寄存器時,結(jié)構(gòu)很有用。

  • 通過重新排列結(jié)構(gòu)中成員的順序,我們也許可以使內(nèi)存使用效率更高。


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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    嵌入式驅(qū)動開發(fā),需要掌握哪些技能?

    :掌握UART、SPI、I2C等接口常見通信協(xié)議,以及如何開發(fā)和調(diào)試相應的通信代碼。 2、 編程技能扎實的編程基礎:嵌入式驅(qū)動開發(fā)的核心是軟件編程,因此至少需要掌握C語言技能。 掌握數(shù)據(jù)結(jié)
    發(fā)表于 01-20 16:46

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

    概述 所謂的嵌入式應用開發(fā)就是在嵌入式操作系統(tǒng)下進行開發(fā)、軟硬件綜合開發(fā) ?嵌入式應用開發(fā)?是指在嵌入式操作系統(tǒng)下進行開發(fā),包括系統(tǒng)化設計指導下的硬件和軟件綜合研發(fā)。
    發(fā)表于 01-12 16:13

    嵌入式應掌握的幾種能力

    1. 編程語言 基本掌握嵌入式必備的編程語言。C語言為主,C++為輔。在資源有限的情況下,大多數(shù)嵌入式產(chǎn)品還是使用C語言為主的,特別是底層
    發(fā)表于 12-08 06:05

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

    一定了解,以便在特定情況下使用。 了解CW32標準庫的用法。 2 、數(shù)據(jù)結(jié)構(gòu)與算法 熟悉各種數(shù)據(jù)結(jié)構(gòu),如數(shù)組、鏈表、棧、隊列等,以及常用的算法,如排序、查找、遞歸等。 能夠根據(jù)
    發(fā)表于 11-28 07:48

    嵌入式與FPGA的區(qū)別

    應用。 FPGA的開發(fā)是邏輯實現(xiàn)+約束+綜合+仿真,嵌入式的開發(fā)是編碼+編譯+調(diào)試,如果是對數(shù)字電路設計感興趣,可以考慮FPGA。 ?在了解下就業(yè)機會哪個多? ?1、嵌入式的就業(yè)機會很多,優(yōu)點就是就業(yè)容易,因為
    發(fā)表于 11-20 07:12

    嵌入式和FPGA的區(qū)別

    ,芯片內(nèi)部的門電路連接在出廠時就已固定,無法更改,它們的功能是通過軟件編程也就是嵌入式軟件來實現(xiàn)的。 FPGA(現(xiàn)場可編程門陣列) 則是一種可編程邏輯器件,其硬件結(jié)構(gòu)可以通過編程來配置,實現(xiàn)各種
    發(fā)表于 11-19 06:55

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

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

    嵌入式達到什么水平才能就業(yè)?

    、LoRa、NB-IoT,能實現(xiàn)嵌入式設備與云端平臺的數(shù)據(jù)交互了解 RTOS 實時操作系統(tǒng):如 FreeRTOS、RT-Thread,能進行任務創(chuàng)建、信號量管理、內(nèi)存分配
    發(fā)表于 09-15 10:20

    嵌入式從入門到進階,怎么學?

    嵌入式從入門到進階,怎么學? 嵌入式學習的核心是 “軟硬結(jié)合的技術(shù)壁壘”,科學分層才能高效突破。以下是從入門到高階的精簡路線,幫你避開彎路: 1、基礎奠基層:構(gòu)建技術(shù)底座 C 語言聚焦 指針、
    發(fā)表于 09-02 09:44

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

    ,把握未來的職業(yè)機遇。 1.智能汽車行業(yè): - 熟悉嵌入式編程語言,如C/C++、Python等。 - 掌握嵌入式系統(tǒng)設計與開發(fā)流程,了解
    發(fā)表于 08-11 15:43

    入行嵌入式應該怎么準備?

    是至關重要的,因此,掌握C/C++編程技巧是入行嵌入式的基礎。 二、硬件基礎知識了解基本的電子電路和數(shù)字邏輯是嵌入式系統(tǒng)開發(fā)的基礎。你需要
    發(fā)表于 08-06 10:34

    Linux嵌入式和單片機嵌入式的區(qū)別?

    : 單片機嵌入式 :開發(fā)環(huán)境相對簡單,通常使用C語言或匯編語言進行編程,開發(fā)工具包括Keil、IAR等。 Linux嵌入式 :開發(fā)環(huán)境較為復雜,除了需要掌握C語言,還需要
    發(fā)表于 06-20 09:46

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

    特定功能的計算機系統(tǒng),廣泛應用于智能家居、工業(yè)控制、醫(yī)療設備、車載系統(tǒng)等領域。 2. 學習嵌入式開發(fā)的前置知識熟悉C語言編程掌握基本的數(shù)據(jù)結(jié)構(gòu)與算法了解數(shù)字電路與微控制器原理熟悉Lin
    發(fā)表于 05-15 09:29

    Python在嵌入式系統(tǒng)中的應用場景

    你想把你的職業(yè)生涯提升到一個新的水平?Python在嵌入式系統(tǒng)中正在成為一股不可缺少的新力量。盡管傳統(tǒng)上嵌入式開發(fā)更多地依賴于CC++語言,Python的優(yōu)勢在于其簡潔的語法、豐富的
    的頭像 發(fā)表于 03-19 14:10 ?1358次閱讀

    嵌入式主板選型與應用指南

    嵌入式主板是專為嵌入式系統(tǒng)設計的核心硬件平臺,廣泛應用于工業(yè)控制、物聯(lián)網(wǎng)、醫(yī)療設備等領域。以下是關于嵌入式主板的詳細介紹:1.嵌入式主板的核心特點緊湊尺寸:通常采用小型化設計(如Min
    的頭像 發(fā)表于 02-27 14:53 ?1051次閱讀
    <b class='flag-5'>嵌入式</b>主板選型與應用指南