我有一个运行 RTOS、IAR 工具的嵌入式系统 (ARM 9263)。系统支持标准 time() 函数,它为我提供当前时间。我需要反向调用,即我需要设置时间 - 是否有“C”标准方式来执行此操作?我已经用谷歌搜索了,当然认为这很明显,但也许它依赖于平台?我不知道为什么,因为 time() 不是 - 任何想法?谢谢!
4 回答
使用 IAR 工具集,time()
可以使用ARM\src\lib\time.c
. 默认例程总是返回 -1,这表明 CRT 不知道现在是什么时间。一旦您提供了自己的 实现time()
,它将从取决于您的目标平台和/或 RTOS 的源获取一天中的时间,您可以通过更新该时间源的任何内容来设置一天中的时间。IAR 很可能已经为他们的 RTOS 做到了这一点——我没有使用过 IAR 的 PowerPac RTOS。
IAR C/C++ 开发指南中概述了这如何适用于另一个 RTOS 或没有 RTOS 的系统的详细信息。
例如,在我使用的一个使用 ST Micro STM32 微控制器的系统上,实时时钟 (RTC) 设置为每秒滴答一次,time()
库函数只返回 RTC 中的值。设置新的日期/时间就是用新值设置 RTC。RTC 的时间计数器设置为 Unix 纪元值(自 1970 年 1 月 1 日以来的秒数),这允许其余的库函数time.h
正常工作(直到 2035 年左右的某个时间,32 位溢出开始造成严重破坏)。
IAR DLIB C 运行时库中的日历例程支持日期为 2035-12-31(我怀疑它们在 2038 年之前溢出,因为内部计算使用 1900 年 1 月 1 日的纪元)。如果您使用 Unic epoch,其他 DLIB 例程或多或少都可以正常工作——我不确定使用不同的 epoch 需要付出多大的努力。
有settimeofday
(2) 允许你这样做——但它是 POSIX 而不是 ANSI C。
您可能还想检查clock_settime
,这可能更适用于嵌入式系统。例如,请参见此手册页。
在 C 或 C++ 中没有标准的方法可以做到这一点。您必须向您的操作系统供应商寻求 API 和/或向编译器或标准库供应商寻求某种扩展。
IAR 工具不是特定于目标的,因此库中的任何内容都不知道如何在您的硬件上设置时间(或阅读它),这取决于您的板级支持包(通常将您的硬件映射到标准库除其他外)。
并非所有目标都具有 RTC。IAR 的工具确实为许多特定的微控制器和现成的开发板提供支持,因此您可能会发现它已经为您完成了 - 您只需要查看即可。
您的微型计算机可能有一个内部 RTC,或者您可能有一个外部 RTC,但“ARM 9263”本身并没有定义 RTC,因此您必须更具体 - RTC 通常作为供应商特定的外围设备添加。然后是获取部件的用户手册并编写必要的寄存器的情况。