为什么getLocalTime实现需要延迟



我注意到我的应用程序在ESP32上有一个奇怪的行为。经过一些"调试"后我认为问题是由于这个功能:

bool getLocalTime(struct tm * info, uint32_t ms)
{
uint32_t start = millis();
time_t now;
while((millis()-start) <= ms) {
time(&now);
localtime_r(&now, info);
if(info->tm_year > (2016 - 1900)){
return true;
}
delay(10);
}
return false;
}

顺便说一下,ms默认为5000。在我的代码中,我在有限状态机中使用getLocalTime以便在特定时间执行操作,即:

void Irrigation::fsm()
{
time_t now = timing.getTimestamp();
switch (state)
{
case Running:
if (now - lastExecution)
{
// do something
}
break;
}
}

地点:

time_t Timing::getTimestamp()
{
struct tm tm;
getLocalTime(&tm);
return mktime(&tm);
}

在我看来,应用程序挂起了(fsm每秒被调用)。实际上,看看getLocalTime的实现,我不明白它是做什么的。为什么它需要一个while周期和每个周期10毫秒的延迟,只是为了检索当前时间?

我正在寻找以秒为单位的epoch时间。我的方法错了吗?

感谢您提出这个问题。我在使用fbiego的ESP32Time时发现了同样的问题。正如你所确定的(谢谢)是获取时间时的延迟。查看代码,它总是有5000ms的延迟,而时间设置在2016年之前。我通过将rtc设置为2022年初来解决我的问题。这为我消除了延迟,直到我使用的GPS获得锁定并给我正确的时间。

如何修复:
将第二个参数传递给函数。它将限制延迟:

getLocalTime(&timeinfo, 5);
如果当前年份为<2016年).

为什么这样实现:

只是分享我的猜测:
函数立即返回,如果计算的年份是>2016. 在本例中,它返回true,即success。

如果评估年份为<2016年,那么这样的结果被认为是失败的结果。因此,函数等待10ms,并再次尝试计算时间。它在那个循环中运行5秒(5000毫秒)。

我认为,这里的假设是在此延迟期间可以从NTP检索到正确的日期/时间。
这当然不会自动发生。但从技术上讲,可能会启动对NTP服务器的请求,在另一个核心上运行)

最新更新