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_wdaytm_yday 稍后在 mktime() 中计算,因此您需要包括时区内容在内的整个混乱才能使这两个标准化。

大部分 16kB 代码与对 siscanf() 的调用有关,sscanf() 的变体,不支持浮点数,(我相信)用于解析时区和 DST 信息环境变量。

链接时使用--specs=nano.specs可以减少很多不必要的代码,这样会切换到简化的printf/scanf代码,在您的案例中节省了大约 10kB 的代码。