如何在ARM处理器中存储数据

时间:2012-07-24 01:37:06

标签: c 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”的问题。我们应该将这个数字视为2的补码还是二进制? 假设,当两个变量之间的差异为零时,我们改变了我们的旗帜。如果我错了,请纠正我。

谢谢

2 个答案:

答案 0 :(得分:2)

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

你想要那个号码是什么?你可以指定它0x8000000UL会使它成为无符号长是吗?

顺便说一句,如果您想要将0x80000000作为无符号长整数,那么您也可以查看now-timestamp结果的msbit

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

并且没有歧义。

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

如果无符号长整数为64位,则可能需要一个&amp; 1,而不是无符号长整数为32。

答案 1 :(得分:0)

在C中,只要0x8000000为32位或更大,常量unsigned int就会表示为int。这是因为编译器必须从以下列表中选择第一个类型,其中可以表示常量:

  • INT
  • unsigned int
  • unsigned long
  • long long
  • unsigned long long

C99 standard第6.4.4.1节)

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

要比较的两个变量都是unsigned int。在与0x80000000的比较中,我无法看到任何目的。当然要检查过去的时间戳是否只需要进行比较

return (now > timeStamp);

如果时间戳是过去的,那么你的代码会返回true,除非它在过去很长的路上,即超过0x80000000毫秒。如果时间戳在将来很长的路上,它也会返回true。

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