2014-03-03 69 views
0

我有以下問題:我試圖定義一些基本結構,這有助於我映射控制器內存的一部分以更有效的方式使用它。讓我爲您介紹一個例子:如何聲明匿名

typedef struct 
{ 
    ICR1_t  ICR1_dByte; /* 0x46 - 0x47 */ 
    OCR1B_t  OCR1B_dByte; /* 0x4A - 0x4B */ 
    OCR1A_t  OCR1A_dByte; /* 0x48 - 0x49 */ 
    TCNT1_t  TCNT1_dByte; /* 0x4C - 0x4D */ 
    TCCR1B_t TCCR1B_Byte; /* 0x4E */ 
    TCCR1A_t TCCR1A_Byte; /* 0x4F */ 
    uint8_t  Filler[8];  /* 0x50-0x57 */ 
    TIFR1_t  TIFR1_Byte; /* 0x58 */ 
    TIMSK1_t TIMSK1_Byte; /* 0x59 */ 
}Timer1_str; 

用法定義:

#define TIMER1str (*(volatile Timer1_str *)(TIMER1_START_ADDRESS)) 

凡TIMER1_START_ADDRESS被定義爲

(uint8_t *)&ICR1 

(ICR1是基本定義的一部分,一些地址,這是沒關係)

所以,我特別的問題是如何填補內存中的空白,位於0x50-0x 57地址?在目前的解決方案中,變量「填料」下的所有自動補充工具可見的,所以可以調用現場:

TIMER1str.Filler[0] = 0xAA; 

我想隱藏的實現,填料。我首先想到的是要實現這種填充物爲匿名聯合,是這樣的:

... 
    TCCR1A_t TCCR1A_Byte; /* 0x4F */ 
    union { Filler[8]; };  /* 0x50-0x57 as anonymous */ 
    TIFR1_t  TIFR1_Byte; /* 0x58 */ 
.... 

但這種方法是不工作...

如何隱藏結構的成員?它應該設置內存,但不應該可以訪問。

回答

0

C不支持這一點。匿名嵌套結構和聯合不會隱藏成員,它們只允許您訪問成員,就好像它們是包含類的成員一樣。

一種可能性是使用C++編譯如果這是你的編譯器支持:

struct Timer1_str 
{ 
    public : 
     ICR1_t  ICR1_dByte; /* 0x46 - 0x47 */ 
     OCR1B_t  OCR1B_dByte; /* 0x4A - 0x4B */ 
     OCR1A_t  OCR1A_dByte; /* 0x48 - 0x49 */ 
     TCNT1_t  TCNT1_dByte; /* 0x4C - 0x4D */ 
     TCCR1B_t TCCR1B_Byte; /* 0x4E */ 
     TCCR1A_t TCCR1A_Byte; /* 0x4F */ 
    private : 
     uint8_t  Filler[8];  /* 0x50-0x57 */ 
    public : 
     TIFR1_t  TIFR1_Byte; /* 0x58 */ 
     TIMSK1_t TIMSK1_Byte; /* 0x59 */ 
} ; 
+0

並且所有的Cpp編譯器都能保證,結構中的數據將直接按照鍵入它們的順序嗎? – Tomas

+0

@ user2759473:好問題。是的,我相信是這樣,但包裝和對齊可能會有所不同。使用編譯器的打包指令可能是明智的。最終,芯片或編譯器廠商幾乎肯定會提供一個定義外設寄存器訪問的頭文件,正如duskwulf指出的那樣,這可能是更好的解決方案。 – Clifford

2

它看起來像你編碼的AVR。

不要這樣做。使用您的編譯器提供的這些寄存器的定義。

正如您所寫,您的代碼指定Timer1_str結構將存在於系統內存中的某個位置,由鏈接器決定。如果沒有任何額外支持,此代碼將無法工作,因爲此結構將映射到SRAM,導致對其寫入沒有特殊效果。即使使用鏈接器將此結構映射到適當的地址(可能或不可能),編譯器生成的代碼也不太合適,因爲它不能使用指令INOUT操縱這些寄存器。 (要生成這些指令,寫入的地址必須在編譯時已知)。另外,編譯器可能會生成不能正確訪問這些寄存器的代碼 - 例如,在這裏它可能會以錯誤的順序產生寫入TCNT的操作。

+0

+1 ...例如AVR libc具有[](http://www.nongnu.org/avr-libc/user-manual/group__avr_io。html) – Clifford

+0

你好,事實上,你說的對AVR來說是正確的,但它是AVR開發人員生成給我們的解決方案的一個包裝。事實上,這個問題更多地集中於在其他結構中定義匿名聯合/數組的可行方法,以便能夠「跳過」某些地址。 – Tomas

相關問題