2014-03-03 72 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

相关问题