하나의 구조와 결합된'묘용'분석

NiosII 그 일들 직렬 실험에서 다음과 같은 프로그램이 있다.
sopc.h
.......
typedef struct
{
//     
union
{
  struct
  {  
    volatile unsigned long int RECEIVE_DATA        :8;  
    volatile unsigned long int NC                  :24;  
  }BITS;
  volatile unsigned long int WORD;
}RXDATA;

//     
union
{
  struct
  {
    volatile unsigned long int TRANSMIT_DATA        :8;
    volatile unsigned long int NC                  :24;
  }BITS;
  volatile unsigned long int WORD;
}TXDATA;

//     
union
{
  struct
  {
    volatile unsigned long int PE                  :1;
    volatile unsigned long int FE                  :1;
    volatile unsigned long int BRK                 :1;
    volatile unsigned long int ROE                 :1;
    volatile unsigned long int TOE                 :1;
    volatile unsigned long int TMT                 :1;
    volatile unsigned long int TRDY                :1;
    volatile unsigned long int RRDY                :1;
    volatile unsigned long int E                   :1;
    volatile unsigned long int NC                  :1;
    volatile unsigned long int DCTS                :1;
    volatile unsigned long int CTS                 :1;
    volatile unsigned long int EOP                 :1;
    volatile unsigned long int NC1                 :19;
  
  }BITS;
  volatile unsigned long int WORD;
}STATUS;

//     
union
{
  struct
  {
    volatile unsigned long int IPE                  :1;
    volatile unsigned long int IFE                  :1;
    volatile unsigned long int IBRK                 :1;
    volatile unsigned long int IROE                 :1;
    volatile unsigned long int ITOE                 :1;
    volatile unsigned long int ITMT                 :1;
    volatile unsigned long int ITRDY                :1;
    volatile unsigned long int IRRDY                :1;
    volatile unsigned long int IE                   :1;
    volatile unsigned long int TRBK                 :1;
    volatile unsigned long int IDCTS                :1;
    volatile unsigned long int RTS                  :1;
    volatile unsigned long int IEOP                 :1;
    volatile unsigned long int NC                   :19;
  
  }BITS;
  volatile unsigned long int WORD;
}CONTROL;

//      
union{
  struct
  {
    volatile unsigned long int BAUD_RATE_DIVISOR     :16;
    volatile unsigned long int NC                    :16;
  }BITS;

  volatile unsigned long int WORD;
}DIVISOR;

}UART_STR;
......

이 프로그램은 매우 교묘하게 써서 매우 복잡해 보인다.
【원리】
(1) 연합체 중의 구성원은 하나의 메모리를 공용하고 첫 번째 구성원에게 초기화 작업을 진행한다.
(2) 비트 세그먼트는 하나의 유형 변수를 다른 비트로 분리하여 같은 유형에 정의된 변수를 쉽게 비트 조작을 할 수 있다. 이는 비트에 별명을 붙이는 것과 같다.
【분석】
(1) UART 이라는 유형이 먼저 만들어졌습니다.STR의 구조체,typedef의 사용에 주의하기;
(2) 이 구조체에는 RXDATA, TXDATA, STATUS, CONTROL, DIVISOR 등 5개의 연합체가 포함되어 있다.
(3) 각 연합체에는 비트 세그먼트를 사용하는 BITS와 WORD가 포함되어 있으며 4바이트, 32bit
【원리1】에서 알 수 있듯이 BITS와WORD는 하나의 메모리를 공용하기 때문에 모든 연합체는 1개의 unsigned int, 즉 4바이트만 차지하고 BITS를 조작할 때WORD의 수치도 바뀐다. 반대로도 마찬가지다.한편으로는 메모리 공간을 절약하고, 다른 한편으로는 BITS에 대한 조작과 WORD에 대한 조작은 비슷하다. 마치 변수에 별명을 붙인 것 같다.BITS 작업은 개별 비트 작업을 간편하게 수행하고 WORD는 전체 작업을 수행합니다.
[예]
uart.c
(1) BITS를 이용한 단일 비트 작업
static int uart_send_byte(unsigned char data)
{
  UART->TXDATA.BITS.TRANSMIT_DATA=data;
  while(!UART->STATUS.BITS.TRDY);
  return 0;
}

(2) WORD를 이용한 전체 운영
static int set_baudrate(unsigned int baudrate)
{
  UART->DIVISOR.WORD=(unsigned int)(ALT_CPU_FREQ/baudrate+0.5);
  return 0;
}

【위단】
비트 세그먼트의 사용은 여러분에게 조작을 편리하게 할 수 있습니다.그러나 비트도 이식하기 어려운 결함이 있다.32개의 기계를 예로 들다.PC기에서 비트의 저장 순서는 오른쪽에서 왼쪽으로 저장된다.Macintosh에는 왼쪽에서 오른쪽으로 저장되어 있습니다.이것은 약간의 문제를 야기할 것이다.현재 16개의 구조가 있다.BITS(예: 비트 세그먼트 구조)와 WORD(unsigned int)로 표시됩니다.PC에서 작동할 때 BITS와 WORD는 모두 최소 16비트에 저장된다.그러나 Macintosh에서는 BITS가 16비트 높게, WORD는 16비트 낮게 불러왔다.이 경우 BITS 및 WORD 작업은 동일하지 않습니다.

좋은 웹페이지 즐겨찾기