2015-01-27 2 views
0

현재 PIC 마이크로 컨트롤러 용 코드를 작성하고 있으며 코드 일부에 "상태 카운터"로 uint8_t을 사용하여 일부 코드를 구조화하고 싶습니다. 여기에는 많은 비트 연산이 포함됩니다. 내가 뭘하고 싶은건이 헤더에있는 SFR 비트 구조체에 비슷한 맥락 에서이 uint8_t에 대한 구조체를 만드는 것입니다, 내가 아래에 사용하고있는 헤더 파일에서 하나의 예제가 포함되어 있습니다.구조체의 구성원으로 uint8_t의 주소 비트

헤더 파일을 사용하면 구조체 내의 요소에 액세스하는 것과 비슷한 표기법 (예 : U1STAbits.UTXBFuint16_t)을 사용하여 SFR 내의 비트에 액세스 할 수 있습니다. 이것은 내가 허용 할 수있는대로 코드에서 구현하고 싶습니다. 스위치 문을 내 코드의 주요 구조로 사용하십시오.

#define U1STA U1STA 
extern volatile unsigned int U1STA __attribute__((__sfr__)); 
__extension__ typedef struct tagU1STABITS { 
    union { 
    struct { 
     unsigned URXDA:1; 
     unsigned OERR:1; 
     unsigned FERR:1; 
     unsigned PERR:1; 
     unsigned RIDLE:1; 
     unsigned ADDEN:1; 
     unsigned URXISEL:2; 
     unsigned TRMT:1; 
     unsigned UTXBF:1; 
     unsigned UTXEN:1; 
     unsigned UTXBRK:1; 
     unsigned :1; 
     unsigned UTXISEL0:1; 
     unsigned UTXINV:1; 
     unsigned UTXISEL1:1; 
    }; 
    struct { 
     unsigned :6; 
     unsigned URXISEL0:1; 
     unsigned URXISEL1:1; 
    }; 
    }; 
} U1STABITS; 
extern volatile U1STABITS U1STAbits __attribute__((__sfr__)); 

업데이트 : 비트 필드 구조체와 내가 수행하는 숫자로 비트 필드에 액세스 할 수 오전 uint8_t 사이에 노동 조합을 정의함으로써

typedef struct { 
    union { 
     struct{ 
      unsigned breakDetected :1; 
      unsigned overrunError :1; 
      unsigned framingError :1; 
      unsigned startDetected :1; 
      unsigned dmxMode  :1; 
      unsigned rdmMode  :1; 
     }; 
     uint8_t UartFlags; 
    }; 
} UartFlagsBits; 

UartFlagsBits uartFlags; 
+0

이것을 비트 필드라고합니다. 그리고 당신의 질문은 무엇입니까? –

+1

거의 모든 최신 CPU의 주소 지정 가능한 최소 단위는 바이트입니다. 표시하는 것과 같은 비트 필드는 개별 비트를 가져 오거나 설정하는 데 필요한 코드를 생성하는 컴파일러에서 처리합니다. –

+0

비슷한 방법으로 비트 필드를 선언한다면 uint8_t로도 액세스 할 수 있습니까? – RobbG

답변

0

: 나는이에서를 기반으로 잠재적 인 솔루션을 만들었습니다 Alex가 제안한 전체 비트 필드에 대한 행동.

typedef struct { 
    union { 
     struct{ 
      uint8_t breakDetected :1; 
      uint8_t overrunError :1; 
      uint8_t framingError :1; 
      uint8_t startDetected :1; 
      uint8_t dmxMode  :1; 
      uint8_t rdmMode  :1; 
     }; 
     uint8_t UartFlags; 
    }; 
} UartFlagsBits; 

UartFlagsBits uartFlags;