Gcc cortex m-newlib纳米时间函数(堆使用)

Gcc cortex m-newlib纳米时间函数(堆使用),gcc,cortex-m,newlib,Gcc,Cortex M,Newlib,我在cortex m系统上工作(GCC+newlib nano(-specs=nano.specs)) 我在那里使用 -gmtime -mktime -本地时间 我面临以下问题: (一) gmtime使用malloc分配一些ram,但永远不会再释放内存 B.) 另一方面,mktime从不调用malloc(或sbrk)来分配内存,而是通过传递一个nullptr来调用free()4次,这是毫无意义的,因为它从来没有分配过内存,free(nullptr)也没有任何意义 我使用来自arm embedde

我在cortex m系统上工作(GCC+newlib nano(-specs=nano.specs))

我在那里使用 -gmtime -mktime -本地时间

我面临以下问题:

(一) gmtime使用malloc分配一些ram,但永远不会再释放内存

B.) 另一方面,mktime从不调用malloc(或sbrk)来分配内存,而是通过传递一个nullptr来调用free()4次,这是毫无意义的,因为它从来没有分配过内存,free(nullptr)也没有任何意义

我使用来自arm embedded的最新arm none eabi gcc(版本9)。 版本9中是否存在任何新库问题


还可能是什么呢?

现在,5个月后,我遇到了一个类似的问题,并对其进行了研究,该部分的实际源代码似乎来自2014年

问题A: gmtime使用malloc分配一些ram,但决不再释放该内存

答复: 在newlib的“time_c”中,有一个函数(strftime除外)调用malloc:tzset_r.c。malloc调用tzset,tzset调用ztset_r。是关于时区的。在此位置存储时区以检测更改(也从环境中读取时区,如果未找到,则使用GMT ist)。我不清楚,为什么指向带有该时区的已分配内存的指针是静态存储的,而不是静态存储时区字符串本身。可能是因为字符串的长度可变,而这在早期的“C”语言版本中是不可能的。它被释放,它改变了时区,但再次分配

问题B:“另一方面,mktime从不调用malloc(或sbrk)来分配内存,但通过传递null ptr调用free()4次”

答:strftime和tz_set同时调用malloc和free。旧指针最初设置为零。在检测到新时区并将其存储在新分配的内存中之前,旧时区将在不进行任何检查的情况下被释放。因此,将出现没有malloc的free。免费呼叫(0)是有效的

我对(A)有一些问题,因为它调用malloc,我使用STM32/FreeRTOS/TouchGFX,它似乎对newlib与FreeRTOS和malloc的结合有一些问题。因此,我也在寻找“localtime”的替代品,这也使得alloc。
(b)不应该根据实际的C++标准来解决问题,但我不确定这是否总是正确的。

< P>现在,5个月后,我遇到了类似的问题并查看它,该部分的实际源代码似乎是2014。 问题A: gmtime使用malloc分配一些ram,但决不再释放该内存

答复: 在newlib的“time_c”中,有一个函数(strftime除外)调用malloc:tzset_r.c。malloc调用tzset,tzset调用ztset_r。是关于时区的。在此位置存储时区以检测更改(也从环境中读取时区,如果未找到,则使用GMT ist)。我不清楚,为什么指向带有该时区的已分配内存的指针是静态存储的,而不是静态存储时区字符串本身。可能是因为字符串的长度可变,而这在早期的“C”语言版本中是不可能的。它被释放,它改变了时区,但再次分配

问题B:“另一方面,mktime从不调用malloc(或sbrk)来分配内存,但通过传递null ptr调用free()4次”

答:strftime和tz_set同时调用malloc和free。旧指针最初设置为零。在检测到新时区并将其存储在新分配的内存中之前,旧时区将在不进行任何检查的情况下被释放。因此,将出现没有malloc的free。免费呼叫(0)是有效的

我对(A)有一些问题,因为它调用malloc,我使用STM32/FreeRTOS/TouchGFX,它似乎对newlib与FreeRTOS和malloc的结合有一些问题。因此,我也在寻找“localtime”的替代品,这也使得alloc。
(b)不应该根据实际的C++标准来解决问题,但我不确定这是否总是正确的。< /P>你能分享你的实际代码吗?这没有多大意义-mktime的一个版本在正确调用时多次调用free(0),听起来像是一个有严重错误的版本,足以阻止发布!free至少被调用一次:if(prev_tzev!=NULL&&strcmp(tzev,prev_tzev)==0)返回;免费(上一次);prev_tzenv=_malloc_r(重新进入),strlen(tzenv)+1;if(prev_tzev!=NULL)strcpy(prev_tzev,tzev);你能分享你的真实代码吗?这没有多大意义-mktime的一个版本在正确调用时多次调用free(0),听起来像是一个有严重错误的版本,足以阻止发布!free至少被调用一次:if(prev_tzev!=NULL&&strcmp(tzev,prev_tzev)==0)返回;免费(上一次);prev_tzenv=_malloc_r(重新进入),strlen(tzenv)+1;if(prev_tzev!=NULL)strcpy(prev_tzev,tzev);根本不要使用动态分配。ARM端口在很多地方都非常糟糕。在任何COSTI中,应该避免使用动态分配,但是我使用的是TMCH32(STM32 F46X),它是在C++中,就像我自己的应用程序一样。不仅time.h而且std::string都使用malloc(别名new)。事实上,我的应用程序因硬错误而崩溃,其中浮点被写入std::stringstream。malloc补丁(David Nadler)可能无法在我的系统上运行,或者设置不正确,我现在想用字符数组替换std::string,用atof等替换流转换。根本不使用动态分配。ARM端口在很多地方都非常糟糕。在任何COSTI中,应该避免使用动态分配,但是我使用的是TMCH32(STM32 F46X),它是在C++中,就像我自己的应用程序一样。不仅time.h而且std::string都使用malloc(别名new)。事实上,我的应用程序崩溃了