【发布时间】:2014-03-03 21:15:19
【问题描述】:
我有以下问题:我正在尝试定义一些基本结构,这有助于我映射控制器内存的一部分以更有效地使用它。让我给你举个例子:
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-0x57 地址下的内存空白?在目前的解决方案中,变量“Filler”在所有自动补码工具下都是可见的,因此可以调用字段:
TIMER1str.Filler[0] = 0xAA;
我希望隐藏该填充程序的实现。我的第一个想法是将这个填充器实现为匿名联合,如下所示:
...
TCCR1A_t TCCR1A_Byte; /* 0x4F */
union { Filler[8]; }; /* 0x50-0x57 as anonymous */
TIFR1_t TIFR1_Byte; /* 0x58 */
....
但是这个解决方案不起作用...
如何隐藏成员的结构?它应该设置内存,但不应该是可访问的。
【问题讨论】: