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 的补码还是二进制?假设,当两个变量之间的差异为零时,我们改变我们的标志。如果我错了,请纠正我。

谢谢

4

2 回答 2

2

(您的问题与 ARM 无关,这是一个语言问题)。

你希望这个数字是多少?你可以指定它 0x8000000UL 将使它成为无符号长是吗?

顺便说一句,如果您想要 0x80000000 作为无符号长整数,那么您也可以只查看现在时间戳结果的 msbit

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

那里没有歧义。

或者

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

如果 unsigned long 是 64 位,则可能需要在结尾加上 &1,如果 unsigned long 是 32 则不需要。

于 2012-07-24T01:51:43.303 回答
0

在 C 中,常数0x8000000将表示为unsigned int32int位或更大的长度。这是因为编译器必须从下面的列表中选择第一个可以表示常量的类型:

  • 整数
  • 无符号整数
  • 无符号长
  • 长长的
  • 无符号长长

C99 标准第 6.4.4.1 节)

并且 0x80000000 不能表示为 32 位int,至少不能用 2 的补码表示。

被比较的两个变量都是无符号整数。在与 0x80000000 的比较中,我看不出任何目的。当然要检查时间戳是否在过去,您只需要进行比较

return (now > timeStamp);

如果时间戳在过去,您的代码将返回 true,除非它过去很长,即超过 0x80000000 毫秒。如果时间戳在未来很长一段时间内,它也会返回 true。

顺便问一下,T0TC 是什么?如果它是一个常数,你的计时器将永远不会过期。

于 2012-07-24T09:15:14.617 回答