5

在上电后立即读取 Ada.Real_Time.Clock 时,它显示的值不接近零,有时甚至是负值。据我所知,Ada.Real_Time.Clock 假设在上电时重置。如何重置 Ada.Real_Time.Clock?

谢谢。

4

4 回答 4

6

Ada 2005 LRM 声明“实时定义为在外部环境中观察到的物理时间。[强调添加--MC]

“语言没有规定时间值是否与任何标准时间参考同步。例如,E可以对应系统初始化的时间,也可以对应某个时间标准的纪元。” ( D.8 [18-19])

正如它所说,Ada 不要求“E”,即作为实时时间值的“零时间”的纪元的开始,对应于任何特定的起点;它由编译器实现者决定。

无论您对所看到的 Time 实例观察到的具体数值是什么,无论是接近零还是远离零、正数还是负数,都完全取决于编译器实现者对 E 的选择、它如何表示时间值以及它如何相应地实现实时能力。

因此,您应该避免编写依赖于特定的、已知的 Time 值的代码,也不要编写需要 Time 值可以密切操作的代码。

Real_Time.Time 值应被视为抽象量。

于 2010-09-20T20:14:54.050 回答
1

同意马克。虽然我看到一些平台自启动以来使用时间(特别是在英特尔平台上,我认为他们喜欢使用处理器的迭代计数器),但这完全取决于编译器供应商。

如果您需要诸如“自启动以来的时间”之类的东西,而您的平台没有给您,那么要做的就是在您启动时获取 Real_Time.Clock,并从 Real_Time.Clock 的所有进一步读取中减去该值。

您可以在此处的 LRM 页面上查看为 Real_Time 包定义的确切设施,包括 Marc 引用您的所有 LRM 部分。

于 2010-09-21T13:22:44.597 回答
0

那是很久以前的事了,但是如果它对某人有帮助……我通过将 0 写入 MCU 的时基寄存器来重置时钟。

于 2014-12-13T09:19:25.153 回答
0

这是一个很好的解释,但是如果有人试图针对实现 real_Time 时钟的代码编写单元测试怎么办?例如,我知道我的函数 foo 与 Ada.Real_Time.Clock 进行内部比较以检查时间跨度。在使用适当的输入执行 foo 之前,我想重置时钟以在内部强制 foo 沿着特定路径下行,并验证结果输出参数是否已更改。

    return_value := foo;
    assert (return_value = path1, "tested foo path1");

    Reset_Clock;

    return_value := foo;
    assert (return_value = path2, "tested foo path2");
于 2020-08-02T15:18:15.567 回答