1

私は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」という数字に問題があります。この数を 2 の補数と見なすべきか、それとも単に 2 進数と見なすべきか? 2つの変数の差がゼロの場合、フラグを変更すると想定されています。間違っていたら訂正してください。

ありがとうございました

4

2 に答える 2

2

(あなたの質問はARMとは関係ありません。言語に関する質問です)。

その数字を何にしたいですか?0x8000000UL を指定すると、unsigned long になりますか?

ところで、0x80000000 を unsigned long として使用したい場合は、now-timestamp の結果の msbit を確認することもできます

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

そこに曖昧さはありません。

また

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

unsigned long が 32 ビットの場合ではなく、unsigned long が 64 ビットの場合、その末尾に &1 が必要になる場合があります。

于 2012-07-24T01:51:43.303 に答える
0

C では、定数は 32 ビット以上のとして0x8000000表されます。これは、コンパイラが定数を表現できる次のリストから最初の型を選択する必要があるためです。unsigned intint

  • 整数
  • 符号なし整数
  • 長いです
  • 符号なしロング
  • ロングロング
  • unsigned long long

( C99 標準セクション 6.4.4.1)

そして 0x80000000 はint、少なくとも 2 の補数では 32 ビットとして表現できません。

比較される変数はどちらも unsigned int です。この 0x80000000 との比較には何の意味もありません。タイムスタンプが過去のものかどうかを確認するには、比較を行うだけです

return (now > timeStamp);

あなたのコードは、タイムスタンプが過去の場合、つまり 0x80000000 ミリ秒を超えていない限り、true を返します。また、タイムスタンプがかなり先の場合も true を返します。

ところでT0TCって何?定数の場合、タイマーは期限切れになりません。

于 2012-07-24T09:15:14.617 に答える