비트 접근
기술노트 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언어의 일부입니다.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.