2012-07-24 44 views
1

我是ARM實驗的新手,我在這個處理器中的數據概念有問題。 我遇到了麻煩。有代碼來檢查計時器間隔:數據存儲如何在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)); 
} 

我有一個數字「0x80000000」的問題。我們應該把這個數字看作二進制補碼還是二進制碼? 這是假設,當兩個變量之間的差異是零,我們改變我們的國旗。糾正我,如果我錯了。

謝謝

+4

在我看來像正常的C/C++代碼...它有什麼特別的ARM?(添加C/C++標籤,因爲它看起來像基本的C問題) – 2012-07-24 01:43:10

回答

2

(你的問題無關與ARM,它是一個語言問題)。

你想要這個數字是什麼?你可以指定它0x8000000UL將它作爲unsigned long yes?

順便說一句,如果你想爲0x80000000作爲一個unsigned long那麼你也可以只看現在時間戳結果

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

的最高位,並沒有歧義存在。

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

可能會上的,所述端需要一個& 1如果無符號長爲64位,而不是如果無符號長爲32

+0

感謝dwelch回覆。 – 2012-07-24 02:14:40

+0

如果你的ARM是32bits,那麼0x80000000u也應該工作AFAIK。 – 2012-07-24 02:17:18

+1

謝謝你們。我在計時器庫中看過這段代碼(時間延遲)。也許我有問題的代碼,請你告訴我的代碼邏輯(其實我不明白爲什麼我們比較條件與0x80000000)? – 2012-07-24 02:39:29

0

在C中,恆定0x8000000將表示爲unsigned int只要int是32位或更大。這是因爲編譯器必須選擇從下面的列表中第一個類型,其中常可表示:

  • INT
  • unsigned int類型
  • 長期
  • unsigned long類型
  • 長長
  • 無符號long long

C99 standard se ction 6.4.4.1)

0x80000000不能表示爲32位int,至少不是2的補碼。

被比較的兩個變量都是unsigned int。與0x80000000的比較我看不到任何目的。當然檢查時間戳是在過去,你只需要做比較

return (now > timeStamp); 

如果時間戳記是在過去,除非是在過去很長的路,即超過爲0x80000000您的代碼返回true毫秒。如果時間戳在未來很長時間,它也會返回true。

順便問一下T0TC是什麼?如果它是一個常量,你的計時器永遠不會過期。

+0

我假設'T0TC'是一個訪問ARM中定時器的宏(這在μC編程中很常見) – 2012-07-24 09:18:48

+0

謝謝jeremy&jonas。你的答案真的很有幫助,但是我在IAR IDE示例中看到了這個代碼來創建延遲。我對這種情況有同樣的看法,我不明白他們爲什麼會將結果與這個數字進行比較! – 2012-07-24 17:39:23

+0

@MohammadYousefi如果兩個變量都被簽名,那麼就有必要糾正溢出問題,因爲定時器的大值(即值> = 0x8000000)看起來是負值。 – JeremyP 2012-07-27 12:37:07