반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- C언어
- booth multiplier
- keynote 사용법
- Sync FIFO
- 연산 가속기 설계
- keynote 도형 복사
- keynote
- keynote 도형 회전
- Cortex-M3
- FIFO 설계
- SPI mode
- LinkedList
- Async FIFO
- i2c
- BSS
- ACK Polling
- asynchronous fifo
- cadence conformal eco
- ISR
- Keynote 표
- booth algorithm
- booth multiplier 설계
- 비동기 FIFO 구조
- 곱셈기 설계
- ARM
- lec check
- LEC
- c
- 자료구조
- malloc
Archives
- Today
- Total
JINTBEAT Design Life
C언어 구조체(struct)와 공동체(union) — 개념부터 시뮬레이션 활용까지 본문
반응형
시스템을 설계하거나 시뮬레이션용 레지스터를 구성할 때, 다양한 변수들을 하나의 단위로 묶어 관리할 수 있다면 훨씬 더 직관적이고 유지보수도 쉬워진다. C언어에서는 바로 이럴 때 구조체(struct)와 공동체(union)를 사용할 수 있다.
괸련 내용을 기초부터 정리해보려고 한다.
🧩 구조체(struct)란?
구조체는 서로 다른 자료형의 변수를 하나의 묶음으로 정의할 수 있도록 해주는 기능이다. 즉, 새로운 자료형을 만드는 것이라 볼 수 있다.
struct Pixel {
int x;
int y;
char color;
};
위 코드는 Pixel이라는 새로운 자료형을 만든 것이다. 이 구조체를 사용하면 다음처럼 변수를 선언하고 사용할 수 있다.
struct Pixel p1;
p1.x = 100;
p1.y = 200;
p1.color = 'R';
🎯 핵심 요약
- struct 구조체이름 { 멤버들 };
- 선언된 구조체는 일반 변수처럼 사용 가능
- 구조체 멤버에는 점(.) 연산자를 통해 접근
🔍 typedef로 더 간단하게 쓰기
typedef를 이용하면 struct 키워드 없이 간결하게 사용할 수 있다.
typedef struct {
int x;
int y;
char color;
} Pixel;
Pixel p1;
💡 구조체 안에 배열과 포인터가 들어있다면?
typedef struct {
int id;
char name[16];
int* value_ptr;
} Sensor;
- 배열(name[])은 배열처럼 sensor.name[0] 형태로 접근
- 포인터(value_ptr)는 일반 포인터처럼 *(sensor.value_ptr) 방식으로 사용
🧪 구조체의 시뮬레이션 활용 예
typedef struct {
uint32_t CTRL;
uint32_t STATUS;
uint32_t DATA;
} RegMap;
RegMap reg;
reg.CTRL = 0x1;
reg.DATA = 0xABCD1234;
➡️ 하드웨어의 레지스터 뱅크를 시뮬레이션할 때 구조체를 활용하면 실물에 가까운 형태로 데이터를 모델링할 수 있다.
🌀 공동체(union)란?
공동체는 구조체와 비슷하지만 모든 멤버가 같은 메모리 공간을 공유한다. 즉, 하나의 값만 저장되며, 서로 다른 방식으로 해석할 수 있다.
union U32 {
uint32_t word;
struct {
uint8_t b0, b1, b2, b3;
} bytes;
};
union U32 u;
u.word = 0x12345678;
printf("%X", u.bytes.b0); // 출력: 78 (리틀엔디안 기준)
🎯 핵심 요약
- memory reinterpretation에 유용 (예: 32비트를 바이트 단위로 분석)
- RTL 시뮬레이션에서 byte-level access를 구현할 때 적합
🧠 구조체와 union을 결합한 고급 사용
typedef union {
uint32_t value;
struct {
uint8_t mode : 3;
uint8_t enable : 1;
uint8_t channel : 4;
} bits;
} RegByte;
typedef struct {
RegByte config;
uint32_t data;
} MyIP;
- config.value로 전체 1바이트 접근
- config.bits.mode로 개별 필드 접근
- 시뮬레이션용 C 코드에서 비트 필드 레지스터를 편리하게 다룰 수 있음
🧭 마무리 요약
| 구분 | STRUCT | UNION |
| 메모리 | 각각 독립적인 메모리 사용 | 모든 멤버가 하나의 메모리 공유 |
| 사용 목적 | 여러 데이터를 그룹으로 묶기 | 하나의 값을 여러 방식으로 해석 |
| 시뮬레이션 | 레지스터 뱅크, 구조화된 데이터 표현 | 레지스터의 바이트/비트 해석 처리 |
📌 Tip: RTL 시뮬레이션에서 구조체를 쓰면 IP별 상태 레지스터, 데이터 버스, bit mask 처리 등을 더 직관적으로 구성할 수 있습니다. 그리고 공동체를 함께 쓰면 바이트 접근이나 필드 마스크를 구현하기도 쉬워집니다.
반응형
'🖥️ - C language' 카테고리의 다른 글
| C언어 - 구조체(4) : 함수로의 구조체 변수 전달과 반환 (0) | 2025.05.31 |
|---|---|
| C언어 - 구조체(2) : 구조체, 배열, 그리고 포인터 (0) | 2025.05.30 |
| C언어 - 문제 풀이(배열과 포인터) (0) | 2025.05.21 |
| C언어 공부 - 포인터 변수가 참조하는 대상의 변경을 허용하지 않는 const 선언 (0) | 2025.05.18 |
| C언어 - Call by value vs Call by Reference (0) | 2025.05.18 |