비트 접근

기술노트 25083

아키텍처:

AVR

컴포넌트:

compiler

업데이트:

2021-05-07 오전 9:32

소개

본 기술 노트는 IAR Embedded Workbench for AVR을 사용할 때, 비트에 접근하는 다양한 방법에 대해 설명합니다.

배경지식

많은 특수 기능 레지스터 (SFRs; Special Function Registers)에는 설정, 삭제 또는 테스트 하기위한 단일 비트가 포함되어 있습니다.

만일 8051 컴파일러에 익숙하다면, ISO/ANSI C 언어의 확장인 dot-bit-number 구문에 (P3.2 예시) 익숙할 것입니다. 이 구문은 IAR C/C++ Compiler for AVR에서는 지원하지 않습니다. 

여러가지 제안

대신 ISO/ANSI C에서는 일반적인 C언어 표현식을 사용하여 비트에 접근할 수 있습니다.

P3 &= ~(1 << 2);   /* clear a bit */
P3 |= (1 << 2); /* set a bit */

컴파일러는 사용자가 수행하는 작업을 이해할 수 있을 정도로 똑똑하여, 가능하면 비트 명령을 사용합니다.

심볼릭 이름을 가진 비트에 접근을 해야하는 경우 io<chip>.h 헤더 파일에 있는 비트 이름을 사용해야 합니다. 예시로, 8535는 INT1이라는 비트를 가진 GIMSK 레지스터가 있으며 다음과 같은 방법으로 설정할 수 있습니다:

GIMSK |= (1 << INT1);

비트 이름 정의를 사용하기 위해 io8535.h 헤더 파일의 끝에 ENABLE_BIT_DEFINITIONS을 정의합니다. 다음과 같이 적용될 수 있습니다:

#define ENABLE_BIT_DEFINITIONS
#include <io8535.h>

코드에서 정의하지 않고 빌드 환경에서도 가능합니다.

I/O 헤더 파일의 SFR 심볼을 정의하는데 사용되는 SFR_?() 메크로는 비트 심볼을 정의하는 것에도 사용할 수 있습니다. 다음과 같이 사용합니다:

GIMSK_Bit2 = 0;

IAR C/C++ Compiler for AVR 버전 2.28A 부터 헤더 파일에는 다음의 주석이 추가됩니다.

/*****************************************************
* An example how the macro's below expand to.
* SFR_B(AVR, 0x1F) Expands to:
* __io union {
* unsigned char AVR;//The sfrb as 1 byte
* struct { //The sfrb as 8 bits
* unsigned char AVR_Bit0:1,
* AVR_Bit1:1,
* AVR_Bit2:1,
* AVR_Bit3:1,
* AVR_Bit4:1,
* AVR_Bit5:1,
* AVR_Bit6:1,
* AVR_Bit7:1;
* };
* } @ 0x1F;
* To set bit 5 of AVR you can do like this:
* AVR |= (1<<5);
* or like this:
* AVR_Bit5 = 1;
****************************************************/

GIMSK_Bit2 심볼은 익명의 1비트 필드 입니다. 익명 부분은 언어확장이며, 비트 필드는 ISO/ANSI C언어의 일부입니다.

모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.