嵌入式C語言中的組成結構是什麼
嵌入式C語言中的組成結構是什麼,嵌入式學習者應該掌握C語言中的組成結構嗎?
在介紹結構之後,將看一下這個強大資料物件的一些重要應用。然後將檢查C語言語法以宣告結構。最後將簡要介紹資料對齊要求。可以透過簡單地重新排列其成員的順序來減小結構的大小。可以將在邏輯上彼此相關的同一型別的多個變數分組為陣列。使用一個組而不是一組自變數,可以更方便地安排和使用資料。
文章來源:電子發燒友
請注意,uint16_t是無符號整數型別,寬度恰好為16位。這是在C標準庫stdint.h中定義的,它提供了與系統規範無關的特定位長度的資料型別。陣列可用於對多個具有相同資料型別的變數進行分組。如果不同資料型別的變數之間存在連線怎麼辦?可以在程式中將這些變數視為一個組嗎?例如,假設需要指定生成上述語音 陣列的ADC的取樣率。
儘管變數voice和sample_rate彼此相關,但它們被定義為兩個獨立變數。為了將這兩個變數相互關聯,我們可以使用稱為結構的C語言的強大資料結構。結構允許將不同的資料型別進行分組並將它們作為單個資料物件處理。結構可以包括不同種類的變數型別,例如其他結構、指向函式的指標、指向結構的指標等。
在這種情況下,有一個名為record的結構,它有兩個不同的成員或欄位:第一個成員是uint16_t元素的陣列,第二個成員是float型別的變數。語法以關鍵字struct開頭。struct關鍵字後面的單詞是一個可選名稱,用於以後引用該結構。將在本文的其餘部分討論定義和使用結構的其他細節。
結構的一個重要應用,即定義了可以將不同型別的單個變數相互關聯的依賴於應用程式的資料物件。這不僅可以實現運算元據的有效方式,還可以實現稱為資料結構的專用結構。資料結構可用於各種應用,例如兩個嵌入式系統之間的訊息傳遞以及將從感測器收集的資料儲存在非連續儲存器位置中。
另外,當程式需要訪問記憶體對映微控制器外圍裝置的暫存器時,結構是有用的資料物件。這指定了用於建立此型別的未來變數的佈局或模板。該模板包含一個uint16_t陣列和一個float型別的變數。模板的名稱是record,它位於關鍵字struct之後。值得一提的是,儲存結構模板沒有記憶體分配。只有在定義了基於此佈局的結構變數之後,才會進行記憶體分配。
為變數mic1分配了一段記憶體。它有空間來儲存陣列的四個uint16_t元素和一個float變數。可以使用成員運算子(.)訪問結構的成員。例如,以下程式碼將100分配給陣列的第一個元素,並將sample_rate的值複製到fs變數(必須是float型別)。
我們在前一節中研究了一種宣告結構的方法。C語言支援本節中將要討論的一些其他格式。你可能會在整個程式中堅持使用一種格式,但熟悉其他格式有時可能會有所幫助。該tag_name和variable_name是可選的識別符號。我們通常會看到這兩個識別符號中的至少一個,但在某些情況下我們可以消除它們。語法1:當tag_name和variable_name都存在時,我們就在模板之後定義結構變數。
現在,如果我們需要定義另一個變數(mic2),我們可以編寫struct record mic2;語法2:僅包含variable_name。在這種情況下,我們必須在模板之後定義所有變數,並且我們不能在程式中定義任何其他變數(因為模板沒有名稱,我們以後也不能引用它)。語法3:在這種情況下,沒有tag_name或variable_name。以這種方式定義的結構模板稱為匿名結構。可以在另一個結構或聯合中定義匿名結構。
要訪問上述匿名結構的成員,我們可以使用成員運算子,由於結構是匿名的,所以我們只使用一次成員運算子來訪問它的成員。在這種情況下,我們應該使用以下程式碼將1.2分配給f:test_var.nested.f=1.2;如你所見,匿名結構可以使程式碼更具可讀性和更簡潔。也可以使用typedef關鍵字和結構來定義新的資料型別。我們將在以後的文章中介紹這種方法。
C標準保證結構的成員將按照在結構中宣告成員的順序一個接一個地位於記憶體中。第一個成員的記憶體地址將與結構本身的地址相同。瞭解資料對齊要求後,我們可能能夠重新排列結構中成員的順序,並提高記憶體使用效率。例如,如果我們重寫上面給出的結構,它的大小將在32位機器上減少到8個位元組。對於記憶體受限的嵌入式系統,將資料物件的大小從12個位元組減少到8個位元組可以節省大量成本,特別是當程式需要許多這些資料物件時。
結構允許我們定義依賴於應用程式的資料物件,這些物件可以將不同型別的單個變數相互關聯,這就產生了一種有效的資料處理方法;稱為資料結構的專用結構可用於各種應用,例如兩個嵌入式系統之間的訊息傳遞以及將從感測器收集的資料儲存在非連續儲存器位置中;當我們需要訪問記憶體對映微控制器外圍裝置的暫存器時,結構是有用的;我們可以透過重新排列結構中成員的順序來提高記憶體使用效率。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69940009/viewspace-2650268/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- "->" 在c語言中是什麼意思?C語言
- Go語言中結構體打Tag是什麼意思?Go結構體
- 在嵌入式C語言中使用結構的方法有哪些C語言
- C語言中陣列溢位是什麼C語言陣列
- C語言中結構體感悟C語言結構體
- Golang語言中的method是什麼Golang
- C++語言中 *與&的作用分別是什麼啊?C++
- c語言中的三種迴圈語句結構C語言
- C語言中結構體直接賦值?C語言結構體賦值
- Golang語言中的interface是什麼(下)Golang
- Golang語言中的interface是什麼(上)Golang
- 在R語言中,因子是什麼R語言
- Python語言中/與//的區別是什麼?Python
- C語言中結構體struct的對齊問題C語言結構體Struct
- c語言以及高階語言中的float到底是什麼以及IEEE754C語言
- InnoDB的邏輯儲存結構是什麼,表空間組成包括哪些?
- C/S結構是什麼意思?有什麼優點?
- 組織結構圖是什麼?怎樣繪製結構圖?
- C語言中編譯和連結C語言編譯
- 什麼是高彈性組織結構? – Jessitron
- C語言中的#和##C語言
- Python語言中的模組、包、庫之間有什麼區別?Python
- Python語言中__init__與__new__的區別是什麼?Python
- 爬蟲框架的功能組成是什麼爬蟲框架
- C語言中的關鍵字有哪些,分別代表什麼意思C語言
- 組合語言1 - 什麼是組合語言?組合語言
- 解析C語言中的sizeofC語言
- C語言中extern的用法C語言
- c語言中的作用域C語言
- 【C】 30_C語言中的字串C語言字串
- 探索 Go 語言中的記憶體對齊:為什麼結構體大小會有所不同?Go記憶體結構體
- ssl證書是由什麼組成?ssl證書是什麼?
- 程式語言中為什麼使用分號作為語句結束符?
- async/await 在 C# 語言中是如何工作的?(下)AIC#
- async/await 在 C# 語言中是如何工作的?(中)AIC#
- async/await 在 C# 語言中是如何工作的?(上)AIC#
- JavaScript的組成結構梳理JavaScript
- 嵌入式開發為什麼選擇C語言?C語言