cortex m - newlib-nano - 时间函数(堆使用)

cortex m - newlib-nano - time functions (HEAP USAGE)

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

我用 - 时间 - 时间 - 当地时间

我面临以下问题:

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

B.) 另一方面,mktime 从来没有调用 malloc(或 sbrk)来分配内存,而是通过传递 nullptr 调用 free() 4 次,这是无稽之谈,因为它从来没有首先分配内存,而 free(nullptr) 不会做任何感觉。

我使用来自 arm-embedded 的最新 arm-none-eabi-gcc(版本 9)。 版本 9 中是否有任何 newlib 问题?

还能是什么?

现在,5个月后,我遇到了类似的问题并查看了它,那部分的实际源代码似乎是2014年的。

问题 A: “gmtime 使用 malloc 分配一些 ram,但永远不会再释放该内存”

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

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

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

有效

我只是遇到 (A) 的问题,因为它调用 malloc,我使用 STM32/FreeRTOS/TouchGFX,这似乎与 newlib 结合 FreeRTOS 和 malloc 有一些问题。因此,我也在寻找同样进行分配的“本地时间”的替代品。 (B) 根据实际的 C++ 标准应该不会出问题,但我不确定这是否总是正确的。