2012-07-24 4 views
1

저는 ARM 실험에서 초보자이며이 프로세서의 데이터 개념에 문제가 있습니다. 문제가 발생했습니다. 나는 숫자 "0x80000000에"문제가있는ARM 프로세서의 데이터 저장소

// get the current timer 0 count 
unsigned long Timer0_GetTimestamp(void) 
{ 
return T0TC; 
} 

// check to see if a timestamp is in the past 
// returns 1 if in the past, 0 if not 
int Timer0_TimestampExpiredCk(unsigned long timestamp) 
{ 
unsigned long now = T0TC; 

if (now > timestamp) 
{ 
if ((now - timestamp) < 0x80000000) 
    return 1; 
else 
    return 0; 
} 
else 
{ 
if ((timestamp - now) >= 0x80000000) 
    return 1; 
else 
    return 0; 
} 
} 

// pause for a specific number of milliseconds 
void Timer0_Delay(unsigned long milliseconds) { 
unsigned long timestamp = Timer0_GetTimestamp() + milliseconds; 
while (!Timer0_TimestampExpiredCk(timestamp)); 
} 

: 타이머 간격을 확인하는 코드가있다. 이 숫자를 2의 보수 또는 2 진수로 간주해야합니까? 두 변수의 차이가 0 일 때 우리는 플래그를 변경합니다. 내가 틀렸다면 나를 바로 잡아라.

+4

정상적인 C/C++ 코드처럼 보입니다 ... ARM에 특별한 점이 있습니까?(기본 C 질문처럼 보이는 C/C++ 태그 추가) –

답변

2

는 (귀하의 질문에 ARM 함께 할 수 없다, 그것은 언어의 문제입니다) 감사합니다.

그 번호는 무엇입니까? 그것을 지정하면 0x8000000UL이 부호없는 long yes가 될 것입니까? 당신이 부호없는 긴으로 0x80000000에를 원하는 경우

BTW 당신은 ​​또한 단지 지금은 타임 스탬프 결과

if((now-timestamp)&0x80000000) 
    return 0; 
else 
    return 1; 

의 msbit 볼 수 있습니다 거기에 모호함이 없습니다. 긴 부호없는 64 비트 길이 부호가 C (32)

+0

답장을 보내 주셔서 감사합니다. –

+0

ARM이 32 비트이면 0x80000000u도 AFAIK를 사용해야합니다. –

+1

여러분 께 감사드립니다. 타이머 라이브러리 (시간 지연)에서이 코드 조각을 보았습니다. 어쩌면 코드에 문제가있을 수 있습니다. 코드의 논리를 말씀해 주시겠습니까? (실제로 나는 0x80000000과 조건을 비교하는 이유를 이해할 수 없습니다)? –

0

하지 경우이 경우

또는

return (~(now-timestamp))>>31; 

그 끝상의 & 1 필요할 수도 상수 0x8000000 같이 표현 될 int 인 경우 unsigned int은 32 비트 이상입니다. 이 컴파일러는 상수 표현 될 수있는 다음 목록에서 첫 번째 유형을 선택해야하기 때문에 :

  • INT
  • 부호 INT
  • 부호없는 긴
  • 오래 오래
  • 부호없는 long long

(C99 standard se ction 6.4.4.1)

0x80000000은 적어도 2의 보수가 아닌 32 비트 int으로 표현 될 수 없습니다.

비교할 변수는 모두 부호없는 int입니다. 이 비교에서 0x80000000과 어떤 목적이 보이지 않습니다. 타임 스탬프가 과거에 경우 확실히 당신은 단지 비교

return (now > timeStamp); 

더 이상 0x80000000에 즉 과거에 매우 긴 방법이 아닌 경우 타임 스탬프가 과거에있는 경우 귀하의 코드가 true를 돌려을 할 필요가 확인 밀리 초. 또한 시간 소인이 장래에 먼 길이면 true를 반환합니다.

그런데 T0TC는 무엇입니까? 상수 일 경우 타이머가 만료되지 않습니다.

+0

나는'T0TC'가 ARM에 타이머를 액세스 할 수있는 매크로라고 가정 것 –

+0

감사 제레미 & 조나스 (그런 것들을 아주 μC 프로그램에서 보통이다). 귀하의 대답은 정말 도움이되었지만 지연 생성을위한 IAR IDE 예제에서이 코드를 보았습니다. 나는이 상태에 대해 같은 견해를 가지고 있으며 왜이 수치와 결과를 비교하는지 이해할 수 없다 !! 두 변수가 서명 된 –

+0

@MohammadYousefi 경우, 타이머의 큰 값 (즉, 값> = 0x8000000을)이 마이너스로 나타나는 것이기 때문에, 오버 플로우 문제를 해결하는 것이 필요하다. – JeremyP