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

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

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

3天內不再提示

了解嵌入式C:什么是結構?

嵌入式星球 ? 2020-09-27 09:59 ? 次閱讀

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

結構體

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

uint16_tvoice[50];

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

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

floatsample_rate;


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

structrecord{
uint16_tvoice[50];
floatsample_rate;
};

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

為什么結構很重要?


上面的示例指出了結構的重要應用,即定義了可以將不同類型的各個變量相互關聯的依賴于應用的數據對象。這不僅導致處理數據的有效方式,而且使我們能夠實現稱為數據結構的專門結構。
數據結構可用于各種應用程序,例如兩個嵌入式系統之間的消息傳遞以及將從傳感器收集的數據存儲在不連續的內存位置中。


圖1.結構可用于實現鏈表。
此外,當程序需要訪問內存映射的微控制器外圍設備的寄存器時,結構是有用的數據對象。在下一篇文章中,我們將介紹結構應用程序。


圖2.STM32MCU存儲器映射。圖片由帶ARM嵌入式系統提供。
聲明結構

要使用結構,我們首先需要指定一個結構模板。考慮下面的示例代碼:

structrecord{
uint16_tvoice[4];
floatsample_rate;
};

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

structrecordmic1;

現在,為變量mic1分配了一部分內存。它有空間存儲數組的四個uint16_t元素和一個float變量。

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

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


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

聲明結構模板的一般語法為:

structtag_name{
type_1member_1;
type_2member_2;
…
type_nmember_n;

}variable_name;

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

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

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

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

structrecordmic2;

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

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

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

語法3:在這種情況下,沒有tag_namevariable_name。以這種方式定義的結構模板稱為匿名結構。可以在另一個結構或聯合中定義匿名結構。下面是一個示例:

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

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

test_var.f=1.2;

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

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

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

test_var.nested.f=1.2;

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

結構的內存布局


C標準保證結構的成員將按照在結構中聲明成員的順序一個接一個地位于內存中。第一個成員的內存地址將與結構本身的地址相同。考慮以下示例:


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


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

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

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

概要

  • 結構允許我們定義依賴于應用程序的數據對象,這些對象可以將不同類型的各個變量相互關聯。這導致了一種有效的數據處理方法。

  • 稱為數據結構的專用結構可用于各種應用程序,例如兩個嵌入式系統之間的消息傳遞以及將從傳感器收集的數據存儲在不連續的內存位置中。

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

  • 通過重新排列結構中成員的順序,我們也許可以使內存使用效率更高。


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

    關注

    180

    文章

    7630

    瀏覽量

    140674
  • 結構體數據
    +關注

    關注

    0

    文章

    3

    瀏覽量

    5998
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    嵌入式開發入門指南:從零開始學習嵌入式

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

    Python在嵌入式系統中的應用場景

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

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

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

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

    。 這些基礎知識有助于更好地理解嵌入式系統的工作原理。 2)精通編程語言: 在嵌入式開發中,C語言是最重要的編程語言,它高效、靈活,能夠直接操作硬件資源。此外,了解
    發表于 01-07 16:56

    新手怎么學嵌入式?

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

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

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

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

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

    什么是嵌入式?一文讀懂嵌入式主板

    在現代科技浪潮中,嵌入式技術已成為支撐各種智能設備和系統運行的核心力量。那么,究竟什么是嵌入式嵌入式系統,顧名思義,是將計算機的硬件和軟件嵌入到某種設備或系統中,以實現特定功能的計算
    的頭像 發表于 10-16 10:14 ?2486次閱讀

    【「嵌入式Hypervisor:架構、原理與應用」閱讀體驗】+ 了解Hypervisor

    三個字,由于近些年一直從事嵌入式產品開發,因此才主動申請測評,幸運選中,甚感榮幸。今天才開始研讀,主要想知道這個Hypervisor是什么,和嵌入式有什么關系,能開發什么產品。 先看一下封面和目錄結構
    發表于 10-13 16:47

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被稱為嵌入式系統的核心組件,是一種用于控制和數據處理的計算機硬件,其設計旨在嵌入特定設備中執行專門任務。嵌入式主板如同是設備的“大腦”,主要功能是根據需要管理和控制設備
    的頭像 發表于 09-30 10:05 ?1537次閱讀

    嵌入式系統的體系結構包括哪些

    嵌入式系統的體系結構通常是一個復雜而精細的架構,旨在滿足特定應用需求,同時兼顧系統的可靠性、效率、成本和體積等多方面因素。以下是對嵌入式系統體系結構的詳細解析,包括其主要組成部分、層次
    的頭像 發表于 09-02 15:25 ?2802次閱讀

    嵌入式常用數據結構有哪些

    嵌入式編程中,數據結構的選擇和使用對于程序的性能、內存管理以及開發效率都具有重要影響。嵌入式系統由于資源受限(如處理器速度、內存大小等),因此對數據結構的選擇和使用尤為關鍵。以下是
    的頭像 發表于 09-02 15:25 ?973次閱讀

    嵌入式系統中的實時操作系統

    嵌入式RTOS是嵌入式應用程序運行、相互交互和與外界通信的底層軟件機制。在本節中,您將了解嵌入式軟件開發人員使用哪些流行RTOS以及它們運行的嵌入式
    的頭像 發表于 08-20 11:28 ?821次閱讀

    嵌入式系統怎么學?

    C++或者Python。這些語言在嵌入式系統開發中都被廣泛應用。 3、微處理器/微控制器架構:學習常見的微處理器和微控制器架構,如ARM、AVR、PIC等,了解其特性和應用場景。 4、
    發表于 07-02 10:10

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

    其他硬件的數據手冊,了解其特性和編程接口。 6. 學習低級編程:嵌入式編程常常需要直接與硬件交互,因此學習如何進行低級編程,如結構體、枚舉類型、指針操作、位操作、內存映射I/O等。 7. 掌握
    發表于 06-21 10:01
    主站蜘蛛池模板: 亚洲国产成人久久99精品 | 寂寞午夜影院 | 精品一区二区三区18 | 黄视频在线免费看 | 天天插天天射天天干 | 免费看欧美一级片 | 国产人成午夜免费看 | 激情欧美一区二区三区中文字幕 | 国产天美| 国产网站黄 | 在线观看的黄网 | 亚洲第一看片 | 日本特黄在线观看免费 | 亚洲日本免费 | 手机亚洲第一页 | 黄色在线观看网站 | 男女全黄做爰视频 | 国产精品永久免费自在线观看 | 午夜色片 | 人人看人人鲁狠狠高清 | se01亚洲 | 日本三级电影在线观看 | 边摸边吃奶边做视频叫床韩剧 | 黄 色 免费网 站 成 人 | 免费在线观看的视频 | 青草国产在线视频 | 午夜国产精品久久影院 | 天使色吧| 天天视频入口 | 最近最新中文字幕6页 | 激情六月天 | 中文字幕视频一区 | 午夜想想爱午夜剧场 | 美女操网站 | 毛片大全免费 | 亚洲性夜 | 精品毛片视频 | 理论片午午伦夜理片影院99 | 人人艹人人艹 | 天天干天天操天天爱 | 免费一级特黄特色大片在线观看 |