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

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

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

3天內不再提示

嵌入式開發中C語言位結構體有哪些用途詳細分析講解

Q4MP_gh_c472c21 ? 來源:未知 ? 2019-02-23 09:07 ? 次閱讀

嵌入式開發中,經常需要表示各種系統狀態,位結構體的出現大大方便了我們,尤其是在進行一些硬件層操作和數據通信時。但是在使用位結構體的過程中,是否深入思考一下它的相關屬性?是否真正用到它的便利性,來提高系統效率?

下面將進行一些相關實驗(這里以項目開發中的實際代碼為例):

1.位結構體類型設計

[cpp]view plaincopyprint?

1.//datastructureexceptfornumberstructure

2.typedefstructsymbol_struct

3.{

4.uint_32SYMBOL_TYPE:5;//datatype,havetheaffecton"datadisplaytype"

5.uint_32reserved_1:4;

6.

7.uint_32SYMBOL_NUMBER:7;//effectivedatanumberinoneelement

8.uint_32SYMBOL_ACTIVE:1;//symbolactivestatus

9.

10.uint_32SYMBOL_INDEX:8;//dataindexinnorflash,resultisrelatedto"xxx_BASE_ADDR"

11.uint_32reserved_2:8;

12.

13.}SYMBOL_STRUCT,_PTR_SYMBOL_STRUCT_PTR;

分析:這里定義了一個位結構體類型SYMBOL_STRUCT,那么用該類型定義的變量都哪些屬性呢?

看下面運行結果:

WORDS是定義的另一個外層類型定義封裝,可以把它當作變量來看待。WORDS變量里前5個數據域的地址都是0x1ffff082c,而reserved_2的地址0x1fff0830,緊接著的PressureState變量是0x1fff0834。

開始以為:reserved_1和SYMBOL_TYPE不在一個地址上,因為他們5+4共9位,超過了1個字節地址,但實際他們共用首地址了;而且reserved_2只定義了8位,竟然實際占用了4個字節(0x1fff0834 - 0x1fff0830),我本來是想讓他占用1個字節的。WORDS整體占了8個字節(0x1fff0834 - 0x1fff082c),設計時分析占用5個字節

(SYMBOL_TYPE 1個;reserved_1 1個;SYMBOL_NUMBER+SYMBOL_ACTIVE 1個;SYMBOL_INDEX 1個;reserved_2 1個)。

uint_32 reserved_2 : 8; 占用4個字節,估計是uint_32在起作用,而這里寫的8位,只是我使用的有效位數,另外24位空閑,如果在下面再定義一個uint_32 reserved_3 : 8,地址也是一樣的,都是以uint_32為單位取地址。

同理,上面的5個變量,共用一個地址就不足為奇了。而且有效位的分配不是連續進行的,例如SYMBOL_TYPE+reserved_1 共9位,超過了一個字節,索性系統就分配兩個字節給他們,每人一個;SYMBOL_NUMBER+SYMBOL_ACTIVE 共8位,一個字節就能搞定。

2、修改數據結構,驗證上述猜想

[cpp]view plaincopyprint?

1.//datastructureexceptfornumberstructure

2.typedefstructsymbol_struct

3.{

4.uint_8SYMBOL_TYPE:5;//datatype,havetheaffecton"datadisplaytype"

5.uint_8reserved_1:4;

6.

7.uint_8SYMBOL_NUMBER:7;//effectivedatanumberinoneelement

8.uint_8SYMBOL_ACTIVE:1;//symbolactivestatus

9.

10.uint_8SYMBOL_INDEX:8;//dataindexinnorflash,resultisrelatedto"xxx_BASE_ADDR"

11.uint_8reserved_2:8;

12.

13.}SYMBOL_STRUCT,_PTR_SYMBOL_STRUCT_PTR;

14.

地址數據如下:

當換成uint_8后,可以看到地址空間占用大大減小,reserved_2只占用1個字節(0x1fff069f - 0x1fff069e),其他變量也都符合上面的結論猜想。但是,注意看上面黃色和紅色的語句,總感覺有些勉強,那么我又會想,前兩個變量數據域是9位,那么他們實際上是不是真正的獨立呢?雖然在uint_8上面他們是不同的地址,在uint_32的時候是不是也是不同的地址空間呢?

3、分析結構體內部的數據域是否連續,看下圖及結果

本來假設:由前2次試驗的結論,一共占用8個字節,節空間占用:(2+4)+(4+4)+(2+2+4)+(2+2)+(6)。可是,實際效果并不是想的那樣。實際只占用了4個字節,系統并沒有按照預想的方式,為RESERVED變量分配4個字節。

分析:

這些數據域,整體相加一共32位,占用4個字節(不考慮數據對齊問題)。而實際確實是占用了4個字節,唯一的原因就是:這些數據域以緊湊的方式鏈接,沒有任何空閑位。實際是不是這樣呢?

看下圖和結果:

這里為了驗證是否緊湊鏈接,用到了一個union數據,后面會講到用union不會對數據組織方式有任何影響,看實際與上次的一樣,也能分析出來。

主要是分析第2和第3個數據域是否緊密鏈接的。OBJECT_ACTIVE_PRE賦值0b00001111,NUMBER_ACTIVE賦值0b00000101,其他變量都是0,看到WORD數值0b1011111000000。分析WORD數據,可以看到這款MCU還是小端格式(高位數據在高端,低位數據在低端,這里不對大小端進行討論),斷開數據變成(0)10111 11000000,正好是0101+1111,OBJECT_ACTIVE_PRE數據域,跨越了兩個字節,并不是剛開始設想的那樣。這就印證了上面的緊密鏈接的結論,也符合數據結果輸出。

4、再次實驗,分析數據是否緊密鏈接,看下圖和結果

可以看到,RESERVED數據域已經不再屬于4個地址空間內了(0x1fff0518 - 0x1fff051b),但是他們整體加起來還是32個位域。這說明數據中間肯定有“空隙”存在了,空隙在哪?看一下NUMBER_STATE,如果緊密的話它應該跟NUMBER_ACTIVE在同一個字節地址上,可是他們并不在一塊,“空隙”就存在這里。

這兩個結構體有什么不一樣?數據類型不一致,一個是uint_32,一個是uint_8。綜上所述:數據類型影響的是編譯器在分配物理空間時的大小單位,uint_32是以4個字節為單位,而后面的位域則是指在已經分配好的物理空間內部再緊湊的方式分配數據位,當物理空間不能滿足位域時,那么系統就再次以一定大小單位進行物理空間分配,這個單位就是上面提到的uint_8或者uint_32。

舉例:上面uint_32時,這些位域不管是不是在一個字節地址上,如果能夠緊湊的分配在一個4字節空間大小上,就直接緊湊分配。如果不能則繼續分配(總空間超過4字節),則再次以4字節空間分配,并把新的位域建立在新的地址空間上(條目1上的就是)。當uint_8時,很明顯如果位域不能緊湊的放在一個字節空間上,那么就從新分配新的1字節空間大小,道理是一樣的。

5、結構體組合、共用體組合是否影響上述結論

可以看到,系統并沒有因為位結構體上面有uint_4的4字節變量或者共用體類型,就改變分配策略把位域都擠到4字節之內,看來他們是沒有什么實質性聯系的。這里把uint_32改成uint_8,或者把位結構體也替換掉,經我試驗證明,都是沒有任何影響的。

總結

1、在操作位結構體時,要關注變量的位域是否在一個變量類型(uint_32或者uint_8)上,判斷占用空間大小

2、除了位域,還要關注變量定義類型,因為編譯器空間分配始終是按類型分配的,位域只是指出了有效位(小于類型占用空間),而且如果位域大于類型空間,編譯器直接報錯(如 uint_8 test :15,可自行實驗)。

3、這兩個因素都影響變量占用空間大小,具體可以結合調試窗口,通過地址分配分析判斷

4、最重要的一點:上面的所有結果,都是基于我自己的CodeWarrior10.2和MQX3.8分析出來的,不同的編譯環境和操作系統,都可能會有不同的結果;而且即便是環境相同,編譯器的配置和優化選項都有可能影響系統處理結果。結論并不重要,主要想告訴大家這一塊隱藏陷阱,在以后處理類似問題時,要注意分析避讓并掌握方法。

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

    關注

    146

    文章

    17336

    瀏覽量

    352696
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137756
  • 嵌入式開發
    +關注

    關注

    18

    文章

    1035

    瀏覽量

    47729

原文標題:嵌入式開發中,C語言位結構體用途詳解

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    詳細分析嵌入式Linux系統啟動流程

    嵌入式Linux專題(一)已經對嵌入式Linux系統的架構及啟動流程了初步的介紹,本文將詳細分析
    發表于 11-05 09:25

    嵌入式開發為什么選擇C語言?

    1、嵌入式開發為什么選擇C語言?(面試題!!!)嵌入式開發操作系統是核心,需要移植,并在上層和底層做
    發表于 12-15 07:45

    嵌入式系統高級C語言編程

    嵌入式系統高級C語言編程》將以實際項目中的代碼作實例來進行介紹,詳細分析嵌入式系統開發中程序
    發表于 10-27 16:36 ?4744次閱讀

    嵌入式開發就業前景分析_嵌入式領域的職業發展方向

    嵌入式開發技術在物聯網領域應用最為廣泛,適合于各個領域,主要應用于消費類電子行業。嵌入式開發的入門門檻還是比較高的。那么嵌入式開發就業前景怎么樣呢?嵌入式領域的職業發展方向是什么?本文
    發表于 01-29 14:09 ?1.9w次閱讀

    嵌入式開發語言哪些_最全面嵌入式開發語言概述

    嵌入式開發語言哪些?嵌入式開發的入門門檻還是比較高的,不僅要懂較底層軟件,對軟件專業水平要求較高,而且必須懂得硬件的工作原理,嵌入式系統應
    發表于 01-29 14:47 ?9885次閱讀
    <b class='flag-5'>嵌入式開發</b><b class='flag-5'>語言</b><b class='flag-5'>有</b>哪些_最全面<b class='flag-5'>嵌入式開發</b><b class='flag-5'>語言</b>概述

    嵌入式開發要學什么嵌入式開發的一些入門教材推薦

    本文檔的主要內容詳細介紹的是嵌入式開發要學什么嵌入式開發的一些入門教材推薦資料免費下載教材包括了:ARM嵌入式項目開發
    發表于 01-10 14:46 ?27次下載
    <b class='flag-5'>嵌入式開發</b>要學什么<b class='flag-5'>嵌入式開發</b>的一些入門教材推薦

    嵌入式開發通常采用哪種編程語言

    目前在嵌入式開發領域比較常見的編程語言C,另外C++、Python、JavaScript等語言也可以進行
    發表于 06-18 16:59 ?1.6w次閱讀

    什么是嵌入式開發?為什么用C語言作為開發語言

    內部做開發的,而操作系統所有的內核都是C語言所編寫的,所以說在嵌入式開發的過程也選擇C
    發表于 11-02 18:50 ?12次下載
    什么是<b class='flag-5'>嵌入式開發</b>?為什么用<b class='flag-5'>C</b><b class='flag-5'>語言</b>作為<b class='flag-5'>開發</b><b class='flag-5'>語言</b>?

    嵌入式開發培訓學什么?嵌入式開發板知識講解

    嵌入式開發就是指在嵌入式操作系統下進行開發,一般常用的系統WinCE,ucos,vxworks,linux,android等。另外,用c
    發表于 11-02 20:21 ?16次下載
    <b class='flag-5'>嵌入式開發</b>培訓學什么?<b class='flag-5'>嵌入式開發</b>板知識<b class='flag-5'>講解</b>

    嵌入式開發為什么選擇C語言作為開發語言

    了解嵌入式開發的朋友們都非常的清楚其核心的開發語言C語言C
    發表于 11-03 09:21 ?17次下載
    <b class='flag-5'>嵌入式開發</b>為什么選擇<b class='flag-5'>C</b><b class='flag-5'>語言</b>作為<b class='flag-5'>開發</b><b class='flag-5'>語言</b>?

    嵌入式為什么選擇C語言作為開發語言

    了解嵌入式開發的朋友們都非常的清楚其核心的開發語言C語言C
    發表于 11-03 14:06 ?15次下載
    <b class='flag-5'>嵌入式</b>為什么選擇<b class='flag-5'>C</b><b class='flag-5'>語言</b>作為<b class='flag-5'>開發</b><b class='flag-5'>語言</b>?

    嵌入式開發為什么選擇C語言?它有哪些特點?

    眾所周知,C語言嵌入式開發占據著十分重要的地位,為什么嵌入式開發要選擇C
    的頭像 發表于 01-04 09:56 ?1295次閱讀
    <b class='flag-5'>嵌入式開發</b><b class='flag-5'>中</b>為什么選擇<b class='flag-5'>C</b><b class='flag-5'>語言</b>?它有哪些特點?

    c語言嵌入式開發

    電子發燒友網站提供《c語言嵌入式開發.zip》資料免費下載
    發表于 11-17 14:11 ?2次下載
    <b class='flag-5'>c</b><b class='flag-5'>語言</b><b class='flag-5'>嵌入式開發</b>

    嵌入式C語言結構特點

    嵌入式開發既有底層硬件的開發又涉及上層應用的開發,即涉及系統的硬件和軟件,C語言既具有匯編
    的頭像 發表于 11-24 16:16 ?760次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>結構</b>特點

    嵌入式開發前景怎么樣?

    嵌入式開發前景非常廣闊,這主要得益于物聯網、人工智能、大數據等技術的快速發展,以及嵌入式系統在各個領域的廣泛應用。以下是對嵌入式開發前景的詳細分析
    的頭像 發表于 07-10 09:00 ?2950次閱讀
    <b class='flag-5'>嵌入式開發</b>前景怎么樣?
    主站蜘蛛池模板: 天堂资源中文官网 | 99久久免费精品国产免费高清 | 欧美adc影院 | 亚洲已满18点击进入在线观看 | 亚洲第八页 | 午夜骚| 中文字幕在线永久在线视频2020 | 神马影院午夜dy888 | av天天看| 色香焦| 亚洲午夜精品久久久久久人妖 | 亚洲第一区第二区 | 国产成人优优影院 | 狠狠色伊人亚洲综合第8页 狠狠色依依成人婷婷九月 狠狠色影院 | 亚洲 欧美 校园 | 444kk免费 | 黄色免费网站在线 | 韩日中文字幕 | 国内精品久久久久影院薰衣草 | 靓装爱神12丝袜在线播放 | 天天摸天天| 在线免费色 | 免费一级毛片不卡在线播放 | 狠狠色噜噜狠狠狠狠2021天天 | 午夜网站在线 | 狠狠色噜噜狠狠狠狠狠色综合久久 | 俺来也俺去啦久久综合网 | 亚洲午夜综合网 | 涩涩高清无乱码在线观看 | 夜夜爽天天干 | 理论片免费午夜 | 黄色一级大片视频 | 狠狠干视频网 | 九九热精品视频在线播放 | 午夜影院免费在线观看 | 一级做a爰片久久毛片免费 一级做a爰片久久毛片免费看 | 毛片网站在线 | 久久久精品免费 | 四虎成人精品在永久在线观看 | 色狠狠狠狠综合影视 | 深深激情网 |