我需要对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
规范化的功能?我意识到链接到这样的私有函数会使代码的可移植性降低。
答案 0 :(得分:1)
validate_structure()
中有一个newlib/libc/time/mktime.c
函数,该函数完成一部分工作,对月,日,小时,分钟,秒进行规范化,但保留星期几和某天每年。
它被声明为static
,因此您不能简单地调用它,而是可以从源代码中复制该函数。 (尽管可能存在许可问题)。或者,您也可以重新实现它,这非常简单。
tm_wday
和tm_yday
稍后在mktime()
中进行计算,因此,为了使这两个标准化,您需要包括时区内容在内的整个混乱。
大部分16kB代码与对siscanf()
的调用有关,后者是sscanf()
的变体,没有浮点支持,(我认为)它用于解析环境变量中的时区和DST信息
您可以在链接时使用 --specs=nano.specs
来削减很多不必要的代码,这将切换为简化的printf
/ scanf
代码,从而节省约10kB的代码根据您的情况。