我有一个运行RTOS,IAR工具的嵌入式系统(ARM 9263)。系统支持标准的time()函数,它给出了当前时间。我需要反向调用,即我需要设置时间 - 是否有“C”标准方法来执行此操作?我已经google了一下,当然认为这很明显,但也许它取决于平台?我不知道为什么,因为时间()不是 - 任何想法?谢谢!
答案 0 :(得分:5)
使用IAR工具集可以使用time()
中的示例覆盖时间C运行时API(ARM\src\lib\time.c
)。默认例程总是返回-1,表示CRT不知道它的时间。一旦您提供了自己的time()
实现,它将从依赖于您的tartget平台和/或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纪元,其他DLIB例程或多或少只是工作 - 我不确定使用不同纪元需要多大程度的努力。
答案 1 :(得分:2)
有settimeofday
(2)允许你这样做 - 但它是POSIX而不是ANSI C.
您可能还想查看clock_settime
,这可能更适用于嵌入式系统。 See this manpage, for example.
答案 2 :(得分:1)
在C或C ++中没有标准的方法可以做到这一点。您必须向您的操作系统供应商寻求API和/或您的编译器或标准库供应商的某种扩展。
答案 3 :(得分:1)
IAR工具不是特定于目标的,因此库中的任何内容都不知道如何设置您的硬件上的时间(或者就此问题而读取),这取决于您的电路板支持包(通常将您的硬件映射到标准库等)。
并非所有目标都有RTC。 IAR的工具确实为许多特定的微控制器和现成的开发板提供支持,因此您可能会发现它已经为您完成了 - 您只需要查看。
您的micro可能有一个内部RTC,或者您可能有一个外部RTC,但“ARM 9263”本身并不定义RTC,因此您必须更具体 - 通常将RTC添加为供应商特定外设。然后就是获得部件用户手册并编写必要的寄存器的情况。