我有以下问题:我试图定义一些基本结构,这有助于我映射控制器内存的一部分以更有效的方式使用它。让我为您介绍一个例子:如何声明匿名
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