我在ARM微控制器上使用TextField
。达到此功能后,处理器将重新启动。
奇怪的是,当我处于调试模式时,代码可以完美运行,但是一旦我想独立使用它,就会遇到重置。
我在俯视什么吗? 是否可以代替此功能?
代码部分就是这样
time()
答案 0 :(得分: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;
}
如果您的时间源需要任何形式的初始化才能起作用,则可以通过多种方式来做到这一点,例如:
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实现类似地依赖于半主机,并且可能需要re-targetting
答案 1 :(得分:-2)
首先,这些非嵌入式代码time.h
和stdio.h
是软件库。您应该有这样的东西:
#include <arm/UART_some_lib.h>
#include <arm/RTC_some_lib.h>
static someStartupFunctions()
{
RTC_setRTC(...);
}
int main(void)
{
someStartupFunctions();
while(1)
{
//Main code here
}
return 0;
}
BUT可以运行操作系统,但不会嵌入编程。