arm-gcc mktime二进制大小

时间:2019-05-29 03:51:14

标签: gcc arm stm32 newlib

我需要对struct tm中的time.h执行简单的算术运算。我需要添加或减去秒或分钟,并且能够规范化结构。通常,我会使用mktime(3)来执行此标准化操作作为副作用:

struct tm t = {.tm_hour=0, .tm_min=59, .tm_sec=40};
t.tm_sec += 30;
mktime(&t);
// t.tm_hour is now  1
// t.tm_min  is now  0
// t.tm_sec  is now 10

我正在具有32 kB闪存的STM32上执行此操作,二进制文件变得非常大。 mktime(3)及其引入的其他内容占用16 kB的闪存-一半的可用空间。

newlib中是否存在专门负责struct tm规范化的功能?我意识到链接到这样的私有函数会使代码的可移植性降低。

1 个答案:

答案 0 :(得分:1)

validate_structure()中有一个newlib/libc/time/mktime.c函数,该函数完成一部分工作,对月,日,小时,分钟,秒进行规范化,但保留星期几和某天每年。

它被声明为static,因此您不能简单地调用它,而是可以从源代码中复制该函数。 (尽管可能存在许可问题)。或者,您也可以重新实现它,这非常简单。

tm_wdaytm_yday稍后在mktime()中进行计算,因此,为了使这两个标准化,您需要包括时区内容在内的整个混乱。

大部分16kB代码与对siscanf()的调用有关,后者是sscanf()的变体,没有浮点支持,(我认为)它用于解析环境变量中的时区和DST信息

您可以在链接时使用 --specs=nano.specs 来削减很多不必要的代码,这将切换为简化的printf / scanf代码,从而节省约10kB的代码根据您的情况。