使用C的嵌入式应用程序中的time()函数问题

Ali*_*Ali -1 c embedded time arm

time()在ARM微控制器上使用。达到此功能后,处理器将重新启动。

奇怪的是,当我处于调试模式时,代码可以完美运行,但是当我想以独立方式应用它时,就会遇到重置。

我在俯视什么吗?是否可以代替此功能?

代码部分是这样的

#include <sys/time.h>
#include <stdio.h>

void main (void)
{

   static time_t  rawtime = 0;

   rawtime = time (NULL);
}
Run Code Online (Sandbox Code Playgroud)

Cli*_*ord 6

是否可以代替此功能?

可用的时间源取决于硬件,而库则与硬件无关。因此,您必须自己提供具有硬件依赖性的库函数的实现,或者在某些情况下,它们可能包含在供应商提供的板级支持程序包(BSP)中。标头time.h提供了您的实现必须遵循的标准声明,而在这种情况下,库提供了一个未完全起作用的默认实现。

如果您使用的是armcc(例如,在Keil ARM MDK中使用的),则默认time()实现使用semi-hosting。也就是说,它从开发主机而不是目标硬件获得时间。

半主机仅在连接到调试主机时进行调试时才起作用。但是,在那种情况下,time()应该返回-1,而不是重新启动处理器。此功能不是重新启动的原因-您可以通过删除它来证明这一点,并且仍然会重新启动。重新启动只是您显式地从中返回main()-运行时还应该做什么?它会直接重新启动,也可能进入繁忙的循环,在其中看门狗定时器到期可能会重新启动它。这取决于您的C运行时环境实现。此外,其行为可能会有所不同,具体取决于是否连接了调试器。可以确定何时激活片上调试,并有条件地执行断点指令,例如中断调试器。

要使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; 
}
Run Code Online (Sandbox Code Playgroud)

如果您的时间源需要任何形式的初始化才能起作用,则可以通过多种方式来进行初始化,例如:

  • 将初始化代码放置在之前运行的运行时启动代码中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
        ...
    }

    ...
Run Code Online (Sandbox Code Playgroud)

最后一种方法可能是最简单且最不容易出错的方法,并且不会给系统添加如果应用程序不使用它可能不需要的代码time()

您的示例代码包含stdio.h但未使用它,但请注意,默认的stdio实现类似地依赖于半主机,并且可能需要重新定位