Embedded 실습/AT91SAM7S256

임베디드 프로그래밍에서 bit연산자 활용법(시프트 연산자, OR연산자)

중동콜링 2013. 4. 16. 22:51

* 비트연산자란?

데이터를 bit단위로 처리하여 메모리 공간 사용을 효율적으로 사용할 수 있게 해주는 연산자로

하드웨어를 다루는 임베디드 시스템에서 유용하게 사용할 수 있다.

비트 연산자는 정수계통의 자료형인 char, int, long에만 사용할 수 있다.

연산자

설명

사용 예

결과

시프트(Shift) 연산자

>> 

해당 비트만큼 우측으로 이동

0xFF >> 4;

1111 1111 >> 4 0000 1111 : 0xF

<< 

해당 비트만큼 좌측으로 이동

0x0F << 4;

0000 1111 << 4 → 1111 0000 : 0xF0

비트 논리 연산자

&

bit단위로 AND 연산

0xA & 0x5;

1010 & 0101 → 0000

|

bit단위로 OR 연산

0xA | 0x5;

1010 |  0101 → 1111

^

bit단위로 XOR 연산

0xA ^ 0x5;

1010 ^ 0101 → 1111

보수 연산자 ( 1의 보수, NOT연산 )

~

bit를 반전시킴

~0xBD;

~1011 1101 → 0100 0010


 다음 소스는 임베디드 프로그래밍에서 비트 연산자가 사용되는 예를 보여준다.


< lcd.h >

위 헤더파일에서는 각 핀을 시프트 연산과 define문을 이용하여 지정하는 것을 확인 할 수 있다.


11~13번 라인에서 LCD의 RS, RW, E 핀이 ARM보드의 24~26번에 연결되어 있으므로 1을 해당 핀의 위치만큼 

좌측으로 시프트 연산을 해줘서 각 핀을 지정해준다.

14번 라인은 데이터 버스가 16~23번핀까지 연결되어 있으므로 0xFF를 16번 좌측으로 이동시켜준다.

 

< lcd.c >

위의 소스에서는 lcd.h에 define문으로 정의되어 있는 레지스터에(PIO_OER, PIO_PER) 

비트 연산으로 한 번에 값을 채워넣는 것을 확인 할 수 있다.

ARM칩은 32bit로 설계되어 있으므로 레지스터에 bit연산을 이용하여 각 핀들의 정보를 

집어 넣을 수 있다.


PIO_OER과 PIO_PER에 대입되는 값을 살펴보면,

LCD_RS : 0000 0001 0000 0000 0000 0000 0000 0000 

LCD_RW : 0000 0010 0000 0000 0000 0000 0000 0000

LCD_EN : 0000 0100 0000 0000 0000 0000 0000 0000

LCD_BS : 0000 0000 1111 1111 0000 0000 0000 0000

위의 네 값을 OR연산하면

PIO_OER: 0000 0111 1111 1111 0000 0000 0000 0000

이라는 값이 최종적으로 대입되는 것을 확인 할 수 있다.