다음과 같은 문제가 있습니다. 좀 더 효율적인 방법으로 컨트롤러 메모리의 일부를 매핑하는 데 도움이되는 몇 가지 기본 구조체를 정의하려고합니다.익명으로 선언하는 방법
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;
사용 정의 : 내가 당신에게 예를 제시하자 TIMER1_START_ADDRESS이
(uint8_t *)&ICR1
으로 정의된다
#define TIMER1str (*(volatile Timer1_str *)(TIMER1_START_ADDRESS))
이 (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