개요
C언어를 사용한다는 가정하에 쓰인 글이다. 비트 연산 및 유니온과 같은 작은 데이터를 효율적으로 다룰 때 쓰이는 기본적인 테크닉을 요약하려고 쓰여졌다.
임베디드 SW에서는 보통 1바이트, 즉 8비트 안에서도 여러 정보를 담아서 보내는 경우가 많다. 예를 들어, 어느 한 비트에서 1이라면 어떤 한 모듈을 켜고, 0이라면 끄라는 명령을 보낼 수 있다. 컴퓨터는 1워드(일반적인 범용 컴퓨터에서 8비트, 임베디드에서는 4비트인 경우도 많다) 단위로 연산을 하기에 이러한 여러 명령을 한 번에 보낼 상황이 잦다.
비트 기본 연산
자료형이 4bit라는 가정 하에 쓰여졌다.
& | 두 비트가 모두 1일 때 1로 설정 | 1101 & 0110 => 0100 |
| | 두 비트 중 하나 이상이 1일 때 1로 설정 | 1000 | 0100 => 1100 |
^ | 두 비트가 다를 때 1로 설정 | 0101 ^ 1010 => 1111 |
~ | 비트를 반대로 설정 | ~0101 => 1010 |
<< | 비트를 왼쪽으로 이동, 범위를 벗어난 값은 무시 | 0101 => 1010 |
>> | 비트를 오른쪽으로 이동, 범위를 벗어난 값은 무시 | 0101 => 0010 |
플래그 설정
특정 기능을 수행하도록, 플래그를 설정하거나 해제하는 경우가 있다. 이 경우에 위 비트 연산을 응용할 수 있다.
#define FAN_ON 0b0001
...
data |= FAN_ON;
팬을 키는 플래그가 최하위 1비트가 1일 때일 경우, 이를 define으로 설정해두고 BIT OR 연산을 통해 플래그를 설정할 수 있다.
#define FAN_OFF 0b1110
...
flag &= FAN_OFF;
반대로, 팬을 끌 때는 BIT AND 연산을 통해 플래그를 해제할 수 있다.
단순히 키고 끄는 것 뿐만 아닌 비트 연산의 여러 응용을 통해 손쉽게 모듈을 제어할 수 있을 것이다.
UNION
C언어에서는 union이라는 데이터 타입을 제공한다. 이는 구조체와 비슷하지만, 모든 멤버가 동일한 메모리 공간을 공유하는 자료형이다. 유니온의 크기는 가장 큰 멤버의 크기로 결정되며, 한 번에 하나의 멤버만 값을 가질 수 있다.
여기서는 일반적으로, 이해하기 쉽게 1word = 8bit로 표현하겠다. 다시 말해, int형은 32bit이다.
typedef struct Bits{
unsigned int bit0 : 1;
unsigned int bit1 : 1;
..
unsigned int bit31 : 1;
} Bits;
union Data {
Bits bits;
unsigned char byte[4];
unsigned int data;
};
여기서 bit0 : 1 따위의 클론과 정수가 함께 있는 문장은, 정수만큼의 비트를 사용하는 자료형이란 뜻이다. 즉, bit0 ~ bit31은 각각 1bit의 데이터를 가지고, Bits 구조체는 32bit의 크기를 가진다.
union Data data;
data.data = 0xF0F0F0F0;
만약 위와 같이, 유니온 자료형으로 선언한 Data의 data(unsigned int)의 값이 0xF0F0F0F0이라고 하자.
그렇다면, byte의 0~3번째 값은 모두 0xF0을 가질 것이다. union Data의 data와 byte는 모두 같은 시작 주소를 가지기 때문이다. 마찬가지로 bits0~3은 1, 4~7은 0, 다시 8~11은 1, 이런 식으로 같은 데이터를 가지게 될 것이다.
물론, data를 수정하지 않고, bits나 byte를 수정하면 data에서도 수정한 데이터가 적용될 것이다. 이를 통해, byte 단위로 입력을 받고 bit 단위나 unsigned int 단위로 연산을 쉽게 수행할 수 있다.
'현생 > 임베디드' 카테고리의 다른 글
Sense-Compute-Control 패턴 (0) | 2024.08.16 |
---|---|
ARM Cortex-M3 Processor Datasheet - 디자인 (0) | 2024.08.12 |
ARM Cortex-M3 Processor Datasheet - 특징 정리 (0) | 2024.08.11 |
ARM 프로세서 - CORTEX M3 (0) | 2024.08.10 |
FreeRTOS - Message Queue (0) | 2024.08.09 |