2009-11-27 3 views

답변

5

에는 1 개 비트 변수가없는,하지만 당신은 특정 예를 들어 비트 분리 수 :

uint32_t original_value = whatever(); 
uint32_t bit15 = (original_value >> 15) & 1; /*bit15 now contains either a 1 or a 0 representing the 15th bit */ 

참고 : 당신이 0 또는 1에서 시작하는 비트 수를 계산한다면 나도 몰라, 그래서 >> 15 하나씩 꺼져 있지만 아이디어를 얻습니다.

다른 옵션은 비트 필드를 사용하는 것입니다. 그러나이 옵션은 지저분 해지며 값의 모든 비트가 어떤 식 으로든 유용하지 않으면 IMO는 가치가 없습니다. 하나 또는 두 개의 비트 만 원한다면 이동 및 마스킹이 필요합니다.

전체적으로이 article이 유용 할 수 있습니다.

+1

에게 또 다른 질문, 표준 -에서 32 비트 변수로 ARM 마이크로 컨트롤러 포트 값을받을 수 있나요 어떻게 처음? –

+0

그게 뭔가 프로세서 특정입니다. 하나의 x86에서는 I/O 포트를 읽고 쓰는'in' 또는'out' 명령을 수행하기 위해 일부 어셈블리 또는 컴파일러 내장 함수를 사용합니다. –

+0

ARM에서 I/O 포트는 아마도 특정 메모리 위치 ("메모리 맵 레지스터")에 매핑되어있을 것입니다. LPC2378 매뉴얼을 잘 읽으십시오. 이러한 모든 레지스터에 대한 이름을 제공하는 C 헤더 파일을 사용할 수 있습니다. –

1

원하는 비트에 해당하는 바이너리 마스크를 단지 비트, (나는 ARM 어떤 경험이없는) 직접 포트 레지스터에 액세스 할 수 있다면 그것은 간단합니다 : 이제

var = (PORT_REGISTER & 0x00008000); 

var는 15 번째 비트가 '0'이면 0을, 15 번째 비트가 '1'이면 0x00008000을 포함합니다. 당신도 '0'또는 '1'을 갖고 싶어

또한, 당신은 그것을 전환 할 수 있습니다 : 컴파일러의 뜻이 마이크로 컨트롤러의 모든에 대한 선언이 포함와 함께

var = ((PORT_REGISTER & 0x00008000) >> 15); 
+1

0x00008000의 더 읽기 쉬운 형태는 런타임이 아닌 번역 시간 동안 어셈블러 나 컴파일러가 계산하게되는'(1 << 15)'입니다. –

0

헤더 파일 (들) 레지스터 및 해당 레지스터의 비트를 읽습니다.

이 문서에서는 포트 입력 레지스터가 PORTA이고 원하는 비트에 PORTA15이라는 마스크가 정의되어 있다고 가정합니다. ternary operator 사용

PinIsSet = (PORTA & PORTA15) == PORTA15; 

또는 등가 :이어서

그 핀의 상태를 판독하기 일반 지점

PinIsSet = (PORTA & PORTA15) ? 1 : 0; 

를 어떻게 모든 레지스터 Reference Manual을 참조하여 비트는 그렇다. 또한 몇 가지 예를 살펴보십시오. (This page on the Keil website에는 둘 다 포함되어 있으며 웹에 다른 예제가 많이 있습니다.)

LPC2378에서
0

(다른 LPC2xxxx 마이크로 컨트롤러 제품군)로, I/O 포트가 시스템 메모리에, 그래서 당신은 다음과 같은 몇 가지 변수를 선언해야합니다

#define DALLAS_PIN (*(volatile unsigned long int *)(0xE0028000)) /* Port 0 data register */ 
#define DALLAS_DDR (*(volatile unsigned long int *)(0xE0028008)) /* Port 0 data direction reg */ 
#define DALLAS_PIN (1<<15) 

0xE0028000이의 주소이므로주의 해주십시오 port0의 데이터 레지스터 및 0xE0028008은 port0의 데이터 방향 레지스터 주소입니다. 앱에서 사용되는 포트 및 비트에 따라이 값을 수정해야합니다. 그 후, 코드 기능에 쓰기 1의 코드 나 매크로, 0을 작성하고 다음과 같이 뭔가를해야 읽기 :

#define set_dqout() (DALLAS_DDR&=~DALLAS_PIN) /* Let the pull-up force one, putting I/O pin in input mode */ 
#define reset_dqout() (DALLAS_DDR|=DALLAS_PIN,DALLAS_PORT&=~DALLAS_PIN) /* force zero putting the I/O in output mode and writing zero on it */ 
#define read_dqin() (DALLAS_DDR&=~DALLAS_PIN,((DALLAS_PORT & DALLAS_PIN)!= 0)) /* put i/o in input mode and test the state of the i/o pin */ 

난이 도움이 될 수 있기를 바랍니다.

감사합니다.

0

비트를 테스트하는 경우 C의 연산자 평가 순서를 기억하는 것이 좋습니다.

if(port & 0x80 && whatever()) 

방금 ​​쓴 예기치 않은 동작이 발생할 수 있습니다

if(port & (0x80 && whatever())) 

그러나 아마

if((port & 0x80) && whatever())