这个功能有替代品吗?
可用的时间来源是硬件依赖的,图书馆是硬件独立的。因此,您必须自己提供具有硬件依赖性的库函数的实现,或者在某些情况下它们可能包含在供应商提供的板支持包 (BSP) 中。头文件 time.h 提供了您的实现必须符合的标准声明,而本例中的库提供了一个功能不完整的默认实现。
如果您使用armcc(例如在Keil ARM MDK中使用),则默认time() http://infocenter.arm.com/help/topic/com.arm.doc.dui0475m/chr1359122861930.html实施用途半托管 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0475m/vaq1478249454515.html。也就是说,它从开发主机而不是目标硬件获取时间。
仅当连接到调试主机进行调试时,半主机才起作用。然而在那种情况下time()
应该返回 -1 而不是处理器重新启动。此功能不是重新启动的原因 - 您可以通过删除它来证明,重新启动仍然会发生。重新启动只是您明确地从main()
- 运行时还应该做什么?它要么直接重新启动,要么可能进入繁忙循环,其中看门狗定时器到期可能会重新启动它。这取决于您的 C 运行时环境实现。此外,根据调试器是否连接,行为可能会有所不同;可以确定片上调试何时处于活动状态,并有条件地执行断点指令,例如中断调试器。
To have time()
要与您的目标硬件正常工作而不是使用半托管,您必须重新实现它。它被定义为弱链接,您提供的任何实现都将覆盖默认值,因此在项目中的某个位置您必须有一个函数:
#include <time.h>
time_t time( time_t* timep )
{
int hour = 0 ;
int minute = 0 ;
int second = 0 ;
int day_of_month = 0 ;
int month = 0 ;
int year = 0 ;
// Your code here to fill time/date from clock source
...
// Normalise to time.h library epoch time_t (normally Unix epoch)
struct tm timeinfo;
timeinfo.tm_mon = month - 1 ; // check assumption here Jan = 0 in tm
timeinfo.tm_mday = day_of_month ;
timeinfo.tm_year = year + 100 ; // check assumption here years start from 1900 in tm
timeinfo.tm_hour = hour ;
timeinfo.tm_min = minute;
timeinfo.tm_sec = second;
// Convert to timestamp
time_t t = mktime(&timeinfo);
if( timep != NULL )
{
*timep = t ;
}
return t;
}
如果您的时间源需要进行任何类型的初始化才能工作,您可以通过多种方式执行此操作,例如:
- 将初始化代码放在之前运行的运行时启动代码中
main()
。例如,您的启动代码可能有一个名为SysInit()
或类似的地方你应该这样做。
- 要求开发者在使用前进行必要的初始化
time()
用来。
- 首次使用时通过修改
time()
功能如下:
#include <time.h>
#include <stdbool.h>
time_t time( time_t* timep )
{
static bool initialised = false ;
if( !initialised )
{
initialised = true ;
// your clock source initialisation here
...
}
...
最后一种方法可能是最简单且最不易出错的方法,并且不会为系统添加应用程序不使用时可能不需要的代码time()
.
您的示例代码包含 stdio.h 但不使用它,但请注意,默认的 stdio 实现同样依赖于半托管,并且可能需要重新定位 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0475m/chr1359122861930.html