Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
localtime()在RTL8710上关闭了大约460000年_C_Embedded_Localtime - Fatal编程技术网

localtime()在RTL8710上关闭了大约460000年

localtime()在RTL8710上关闭了大约460000年,c,embedded,localtime,C,Embedded,Localtime,我正在使用一个运行的RTL8710,但这与这个问题无关,因为我谈论的所有代码都是C代码。RTL8710具有用于系统某些部分的专有库,包括localtime 然而,当像这样使用localtime时,localtime似乎被关闭了约460000年,它取自: 这将返回以下结构: {tm_sec = 51, tm_min = 36, tm_hour = 15, tm_mday = 25, tm_mon = 8, tm_year = -458682, tm_wday = 2,

我正在使用一个运行的RTL8710,但这与这个问题无关,因为我谈论的所有代码都是C代码。RTL8710具有用于系统某些部分的专有库,包括localtime

然而,当像这样使用localtime时,localtime似乎被关闭了约460000年,它取自:

这将返回以下结构:

{tm_sec = 51, 
 tm_min = 36, 
 tm_hour = 15, 
 tm_mday = 25, 
 tm_mon = 8, 
 tm_year = -458682, 
 tm_wday = 2, 
 tm_yday = 267, 
 tm_isdst = -1515870811}
显然,这是不正确的,应该接近2018年11月24日13:52:04 GMT。但这不是随机的,因为时间似乎总是相差2小时几分钟左右

这里唯一值得注意的是,代码使用默认的系统头time.h和string.h,在我的例子中,这两个头来自Ubuntu 18.10,64位


我不知道RealTek真正使用的是什么stdlib库,但从调试信息newlib/libc/time/lcltime.c判断,我猜它是一个修改的?newlib的版本。

代码使用了错误的类型,这会导致未定义的行为。1

更好的代码应该在取消引用localtime返回值之前测试它

struct tm *p = localtime(&current_sec);
if (p) {
  struct tm current_tm = *p;
  ...
1错误的类型宽度可通过以下方式证明

int main() {
  long current_sec = 1543067026;
  struct tm current_tm = { .tm_sec = 51, .tm_min = 36, .tm_hour = 15, //
      .tm_mday = 25, .tm_mon = 8, .tm_year = -458682, //
      .tm_wday = 2, .tm_yday = 267, .tm_isdst = -1515870811 };

  time_t t = mktime(&current_tm);
  printf("%16lx\n%16llx\n", current_sec, (unsigned long long) t);
}
输出

        5bf95592
fffff2d55bf9a9f3
        ^^^^

许多位排列在一起。我怀疑高位差异是由于本地_时间引用了垃圾位,而低位差异是由于极端计算、OP非同步发布代码和声称的输出,或者my和OP的标准库之间的差异。虽然时区较少,但my和OP的时区差异会导致locatime/mktime差异。

代码使用了错误的类型,这会导致未定义的行为。1

更好的代码应该在取消引用localtime返回值之前测试它

struct tm *p = localtime(&current_sec);
if (p) {
  struct tm current_tm = *p;
  ...
1错误的类型宽度可通过以下方式证明

int main() {
  long current_sec = 1543067026;
  struct tm current_tm = { .tm_sec = 51, .tm_min = 36, .tm_hour = 15, //
      .tm_mday = 25, .tm_mon = 8, .tm_year = -458682, //
      .tm_wday = 2, .tm_yday = 267, .tm_isdst = -1515870811 };

  time_t t = mktime(&current_tm);
  printf("%16lx\n%16llx\n", current_sec, (unsigned long long) t);
}
输出

        5bf95592
fffff2d55bf9a9f3
        ^^^^

许多位排列在一起。我怀疑高位差异是由于本地_时间引用了垃圾位,而低位差异是由于极端计算、OP非同步发布代码和声称的输出,或者my和OP的标准库之间的差异。虽然时区较少,但my和OP的时区差异会导致位置时间/MK时间差异。

那么它是缩短46万年还是缩短2小时?localtimeconst time*timer需要一个时间*,不一定很长*。使用当前时间秒。如果这还不接近解决方案,您需要发布一个。@stackptr的完整日期为46万年,但时间在两个小时内是正确的。这段代码实际上是从Realtek提供的SDK中提取的,所以我希望它能工作,但我会做出建议的修改,并报告结果。最简单的例子是添加几个标题并将其包装在一个主{}中,我会将其编辑到问题中。同时检查endianness。那么它是关闭460K年还是关闭2小时?localtimeconst time_t*timer需要一个时间,不一定是很长的时间*。使用当前时间秒。如果这还不接近解决方案,您需要发布一个。@stackptr的完整日期为46万年,但时间在两个小时内是正确的。这段代码实际上是从Realtek提供的SDK中提取的,所以我希望它能工作,但我会做出建议的修改,并报告结果。最简单的例子是添加几个标题并将其包装在一个主{}中,我将把它编辑到问题中。检查endianness。是的,就是这样。SDK实现刚刚中断。谢谢对于遇到相同问题的任何其他人:您需要以秒为单位更改长更新。。。在component/common/network/sntp/sntp.c到time\u t update\u sec。。。。SDKYup的3.5a和4.0b都是如此。SDK实现刚刚中断。谢谢对于遇到相同问题的任何其他人:您需要以秒为单位更改长更新。。。在component/common/network/sntp/sntp.c到time\u t update\u sec。。。。SDK的3.5a和4.0b都相同