Software/Programming2014. 8. 11. 12:19

프로그래밍 목적이라기 보다는 DSP에서 한번 나왔던 개념이기에 혹시 궁금하신 분들은 참고하길 바랍니다~

 

사전적인 의미

:구조체의 구성 요소(member)의 선언에서 ':'을 함께하는 정수식을 지정하는 방법

 

목적

:메모리의 낭비를 줄이기 위함

 

요즘 컴퓨터는 성능이 매우 좋아서 별로 쓰이지 않지만, DSP와 같이 자원이 한정적인 기기들에는 여전히 유용하다.

예를들어 Int형 정수를 사용하는데 그 값은 0아니면 1만 나온다고 하자.(가령 GPIOA의 MUX는 0아니면 1이면 충분하다.) Uint16이라고 해도 16비트 즉 2바이트다. 1비트면 충분한데 16비트로 사용한다면 정말 큰 메모리 낭비이지 않겠는가? 이때, 선언은 16비트라도 메모리를 1비트로 사용할 수 있다.

 

아래 구조체를 보자

 

struct BitFieldTest    {

unsinged int a : 2;

unsinged int b : 3;

};

 

이 구조체에 대한 size는 32비트(16X2)로 잡히고 하위 두 비트(0,1 번째)와 그 위의 세 비트(2,3,4 번째)가 사용되고 나머지 비트들은 사용되지 않는다. 따라서 메모리를 아낄 수 있다.

 

단점을 들자면 이 32비트 메모리에서 특정 비트들만 값을 변경할 때, 예를 들어 BitFieldTest.a = 1을 하면 단순히 a에 1을 대입하는 것이 아니라 (BitFieldTest & 3 | 1)로 처리되어 비트 연산을 수행하기 때문에 메모리는 아끼지만 속도가 느려지게 된다. MCU에서 MUX레지스터를 자주 바꾸지는 않을테니 큰 문제는 되지 않을것이라 본다.

위의 (BitFieldTest & 3 | 1)이 무슨 의미냐 하면 3이란 숫자는 0b11로 2비트를 의미하기 때문에 BitField의 2비트를 &로 추려내고 여기에 or연산자로 1을 대입하는 것이다. 따라서 한번 연산할 것을 2번연산하게 되는 것이다.

 

struct GPAMUX_BITS    {

Uint16 PWM1_GPIOA0 : 1;

Uint16 PWM2_GPIOA1 : 1;

...

};

 

DSP 28x의 GPAMUX_BITS이다 단지 ON, OFF 만 사용한다면 0,1이면 되기에 1비트만으로도 충분하다.

 

signed 변수를 사용할 때 오버플로우 또는 언더플로우가 발생하지 않도록 값의 대입을 조심하도록 하자.

또한 당연하겠지만 비트수에 따른 표현 가능한 수의 갯수는 2의 n승이다.

Posted by 십자성군