【发布时间】:2021-07-20 02:26:41
【问题描述】:
我正在尝试了解 Arduino C++(特别是 Due/SAM3X8E)的溢出条件,以便基于 micros() 函数编写定时器逻辑。
对于那些不知道的人,Arduino micros() 函数返回自程序启动以来经过的微秒数,为 32 位无符号长。该值将每 2^32 微秒(约 71 分钟)换行一次。
问题是我在 GCC 中看到的结果与我在在线 arduino 模拟器上得到的结果不同。
这是我的测试代码 - 首先是 GCC 版本:
#include <stdio.h>
int main()
{
unsigned long currentTime = 0x00000100;
unsigned long earlierTime = 0xFFFFFF00;
unsigned long result = currentTime-earlierTime;
printf("%lx", result);
return 0;
}
上面的设置是通过在结果变量中产生一个负数来使值溢出,并返回十六进制 ffffffff00000200,正如我所期望的那样。
但是在Arduino:
// setup
unsigned long currentTime = 0x00000100;
unsigned long earlierTime = 0xFFFFFF00;
// main loop
unsigned long result = currentTime-earlierTime;
在在线 arduino sim wokwi 上运行它会返回(十六进制)200,这是意料之外的,但实际上对我更有用,因为当 micros() 输出每 71 分钟归零时,我的计时器检查仍然有效。
所以我的问题是:为什么会有不同的行为?我可以依赖在线 Arduino 模拟器表现出的行为与 Arduino Due 相同(模拟器基于 Uno)吗?目前我没有真正的 Due 硬件可供测试。
我希望这个问题对某人有意义。
【问题讨论】:
-
那么你想知道为什么有些在线模拟器会给出不同的结果吗?你在比较两个不同的部分,谁知道模拟器是否准确?
标签: arduino long-integer unsigned