我是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的补码还是二进制? 假设,当两个变量之间的差异为零时,我们改变了我们的旗帜。如果我错了,请纠正我。
谢谢
答案 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
。这是因为编译器必须从以下列表中选择第一个类型,其中可以表示常量:
(C99 standard第6.4.4.1节)
并且0x80000000不能表示为32位int
,至少不能表示为2的补码。
要比较的两个变量都是unsigned int。在与0x80000000的比较中,我无法看到任何目的。当然要检查过去的时间戳是否只需要进行比较
return (now > timeStamp);
如果时间戳是过去的,那么你的代码会返回true,除非它在过去很长的路上,即超过0x80000000毫秒。如果时间戳在将来很长的路上,它也会返回true。
顺便说一下T0TC是什么?如果它是一个常数,那么你的计时器永远不会过期。