【问题标题】:How do you set system time using C/C++?如何使用 C/C++ 设置系统时间?
【发布时间】:2010-11-28 04:33:36
【问题描述】:

我有一个运行 RTOS、IAR 工具的嵌入式系统 (ARM 9263)。系统支持标准 time() 函数,它为我提供当前时间。我需要反向调用,即我需要设置时间 - 是否有“C”标准方式来执行此操作?我已经用谷歌搜索了,当然认为这很明显,但也许它依赖于平台?我不知道为什么,因为 time() 不是 - 任何想法?谢谢!

【问题讨论】:

  • 这个问题的答案取决于操作系统。在 Unix 上,有 settimeofday() 和各种 adjtime() 或 adjtimex() 调用。
  • 而 stime() 是一个遗留的 Unix 函数。

标签: c++ c time embedded rtos


【解决方案1】:

settimeofday(2) 允许您这样做——但它是 POSIX 而不是 ANSI C。

您可能还想查看clock_settime,它可能更适用于嵌入式系统。 See this manpage, for example.

【讨论】:

    【解决方案2】:

    使用 IAR 工具集,可以使用 ARM\src\lib\time.c 中的示例覆盖一天中的时间 C 运行时 API (time())。默认例程总是返回 -1,这表明 CRT 不知道现在是什么时间。一旦您提供了自己的time() 实现,它将从取决于您的目标平台和/或 RTOS 的源获取一天中的时间,您可以通过更新该时间源来设置一天中的时间。 IAR 很可能已经为他们的 RTOS 做到了这一点——我没有使用 IAR 的 PowerPac RTOS。

    IAR C/C++ 开发指南中概述了这对另一个 RTOS 或没有 RTOS 的系统如何工作的详细信息。

    例如,在我使用 ST Micro STM32 微控制器的系统上,实时时钟 (RTC) 设置为每秒滴答一次,time() 库函数只返回实时时钟。设置新的日期/时间就是用新值设置 RTC。 RTC 的时间计数器设置为 Unix 纪元值(自 1970 年 1 月 1 日以来的秒数),这使得 time.h 中的其余库函数可以正常工作(直到 2035 年 32 位溢出开始发生时的某个时间)破坏)。

    IAR DLIB C 运行时库中的日历例程支持日期到 2035-12-31(我怀疑它们在 2038 年之前溢出,因为内部计算使用 1900 年 1 月 1 日的纪元)。如果您使用 Unic epoch,其他 DLIB 例程或多或少都可以正常工作 - 我不确定使用不同的 epoch 需要付出多大的努力。

    【讨论】:

      【解决方案3】:

      在 C 或 C++ 中没有标准的方法来执行此操作。您必须向操作系统供应商寻求 API 和/或向编译器或标准库供应商寻求某种扩展。

      【讨论】:

        【解决方案4】:

        IAR 工具不是特定于目标的,因此库中的任何内容都不知道如何在您的硬件上设置时间(或为此阅读它),这取决于您的板级支持包(通常将您的硬件映射到标准库等)。

        并非所有目标都具有 RTC。 IAR 的工具确实为许多特定的微控制器和现成的开发板提供支持,因此您可能会发现它已经为您完成了 - 您只需要查看即可。

        您的微控制器可能有一个内部 RTC,或者您可能有一个外部 RTC,但“ARM 9263”本身并没有定义 RTC,因此您必须更加具体 - RTC 通常作为供应商特定的外围设备添加。然后就是获取部件的用户手册并编写必要的寄存器。

        【讨论】:

          猜你喜欢
          • 2017-05-27
          • 2020-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-30
          • 2023-04-03
          • 1970-01-01
          相关资源
          最近更新 更多