2013-12-11 74 views
1

有人可以請看看這段代碼。2結構內聯合,從頭文件

//位域定義

typedef union { 
struct { 
    unsigned TRISA0     :1; 
    unsigned TRISA1     :1; 
    unsigned TRISA2     :1; 
    unsigned TRISA3     :1; 
    unsigned TRISA4     :1; 
    unsigned      :1; 
    unsigned TRISA6     :1; 
    unsigned TRISA7     :1; 
}; 
struct { 
    unsigned RA0     :1; 
    unsigned RA1     :1; 
    unsigned RA2     :1; 
    unsigned RA3     :1; 
    unsigned RA4     :1; 
    unsigned      :1; 
    unsigned RA6     :1; 
    unsigned RA7     :1; 
}; 
} TRISAbits_t; 
extern volatile TRISAbits_t TRISAbits @ 0xF92; 

這是從一個頭文件一個PIC微控制器。

什麼我已經知道,

1)本聯盟的規模是它裏面的最大元素。 所以我們有2層結構在這裏用相同的大小,所以聯合的大小將是 的sizeof(無符號)* 8

2):1中的每個變量之後給出比特級別的訪問

3 )訪問TRISA0或RA0可訪問內存中的相同位,其餘位置如此。

想想我的困惑源於這部分

extern volatile TRISAbits_t TRISAbits @ 0xF92; 

4)的extern聲明類型TRISAbits_t的TRISAbits但它不分配內存。

5)易失性意味着可以通過不同的線程更改內存,而不會改變我的代碼。 6)當我寫代碼時,我會寫TRISAbits.RA0,它與TRISAbits.TRISA0相同。

7)@ 0xF92十六進制是做什麼的?並且我的答案是否正確?

謝謝。

編輯。 對於任何感興趣的人來說,這是從PIC18f1220微控制器頭文件

+1

不,它的大小*不是* sizeof(unsigned)* 8'。由於每個結構都是位域,每個成員只佔用一個位。聯合的大小是'sizeof(TRISAbits_t)',沒有別的。 –

回答

3

這是相當多的問題都捲入......我不知道有多少次,因爲a)你的編號是壞的,b)並非全部編號你的問題中的項目實際上是問題。 :)

大小將受所有結構成員位域影響。這很難具體,但是這個級別的代碼(通常是針對編譯器和硬件的一個非常特殊的組合)通常會寫入一些非常特別的結果。

在這種情況下,我會說大小可能是1,因爲有8位被映射出來。

extern表示「將地址0xf92處的內存視爲此類型的值」。這是映射出一個絕對位置,其中PIC有一個硬件寄存器。這個語法不是標準C語言,這是一些編譯器的擴展。便攜式方式將是申報這樣的:

// in some header 
extern volatile TRISAbits_t * const TRISAbits; 

// in some library or C file that you link into your app: 

volatile TRISAbit_t * const TRISAbits = (volatile TRISAbits_t *) 0xf92; 

這聲明TRISAbits爲指針寄存器,而不是一個變量實際上是寄存器的地址。指針風格指的訪問必須是這樣的:

TRISAbits->RA0 = 0; 

它還使用更多的內存,因爲全球指針變量有「活」 somwhere,而神奇的@ -instance住在寄存器空間,而不是在內存。

+0

我正確地認爲'@ 0xF92'是某種編譯器擴展嗎? – DevSolar

+0

@DevSolar當然,我現在說得更清楚了,謝謝。 – unwind

+0

@unwind謝謝..有道理,確實0xf92是RAM中TRISA端口寄存器的內存地址。 – tesseract