arm-gcc mktime 二进制大小
arm-gcc mktime binary size
我需要对 time.h
中的 struct tm
执行简单的算术运算。我需要添加或减去秒或分钟,并能够规范化结构。通常,我会使用 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 的闪存——可用空间的一半 space.
newlib中有专门负责struct tm
归一化的函数吗?我意识到链接到这样的私有函数会使代码的可移植性降低。
newlib/libc/time/mktime.c
中有一个 validate_structure()
函数,它完成了一部分工作,规范化月份、day-of-month、小时、分钟、秒,但留下 day-of-week和 day-of-year 一个人。
已声明 static
,因此您不能简单地调用它,但您可以从源代码中复制该函数。 (虽然可能存在许可问题)。或者你可以重新实现它,非常简单。
tm_wday
和 tm_yday
稍后在 mktime()
中计算,因此您需要包括时区内容在内的整个混乱才能使这两个标准化。
大部分 16kB 代码与对 siscanf()
的调用有关,sscanf()
的变体,不支持浮点数,(我相信)用于解析时区和 DST 信息环境变量。
链接时使用--specs=nano.specs
可以减少很多不必要的代码,这样会切换到简化的printf
/scanf
代码,在您的案例中节省了大约 10kB 的代码。
我需要对 time.h
中的 struct tm
执行简单的算术运算。我需要添加或减去秒或分钟,并能够规范化结构。通常,我会使用 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 的闪存——可用空间的一半 space.
newlib中有专门负责struct tm
归一化的函数吗?我意识到链接到这样的私有函数会使代码的可移植性降低。
newlib/libc/time/mktime.c
中有一个 validate_structure()
函数,它完成了一部分工作,规范化月份、day-of-month、小时、分钟、秒,但留下 day-of-week和 day-of-year 一个人。
已声明 static
,因此您不能简单地调用它,但您可以从源代码中复制该函数。 (虽然可能存在许可问题)。或者你可以重新实现它,非常简单。
tm_wday
和 tm_yday
稍后在 mktime()
中计算,因此您需要包括时区内容在内的整个混乱才能使这两个标准化。
大部分 16kB 代码与对 siscanf()
的调用有关,sscanf()
的变体,不支持浮点数,(我相信)用于解析时区和 DST 信息环境变量。
链接时使用--specs=nano.specs
可以减少很多不必要的代码,这样会切换到简化的printf
/scanf
代码,在您的案例中节省了大约 10kB 的代码。