하나의 구조와 결합된'묘용'분석
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 작업은 동일하지 않습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Ruby의 구조체 클래스은 접근자 메서드가 있는 속성 모음입니다. 클래스를 명시적으로 작성할 필요 없이. Struct 클래스는 구성원 및 해당 값 집합을 포함하는 새 하위 클래스를 생성합니다. 각 멤버에 대해 #attr_accessor 와...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.