我有以下問題:我試圖定義一些基本結構,這有助於我映射控制器內存的一部分以更有效的方式使用它。讓我爲您介紹一個例子:如何聲明匿名
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 */
....
但這種方法是不工作...
如何隱藏結構的成員?它應該設置內存,但不應該可以訪問。
並且所有的Cpp編譯器都能保證,結構中的數據將直接按照鍵入它們的順序嗎? – Tomas
@ user2759473:好問題。是的,我相信是這樣,但包裝和對齊可能會有所不同。使用編譯器的打包指令可能是明智的。最終,芯片或編譯器廠商幾乎肯定會提供一個定義外設寄存器訪問的頭文件,正如duskwulf指出的那樣,這可能是更好的解決方案。 – Clifford