【问题标题】:arm-gcc mktime binary sizearm-gcc mktime 二进制大小
【发布时间】:2019-05-29 16:54:31
【问题描述】:

我需要从time.hstruct 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 的闪存——可用空间的一半。

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

【问题讨论】:

    标签: gcc arm stm32 newlib


    【解决方案1】:

    newlib/libc/time/mktime.c 中有一个 validate_structure() 函数,它完成了部分工作,标准化月份、月份、小时、分钟、秒,但保留了星期几和年份一个人。

    它被声明为static,所以你不能简单地调用它,但你可以从源代码中复制函数。 (虽然可能存在许可问题)。或者你可以重新实现它,这很简单。

    tm_wdaytm_yday 稍后在 mktime() 中计算,因此您需要包括时区在内的所有内容才能使这两个标准化。

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

    您可以在链接时使用 --specs=nano.specs 减少大量不必要的代码,这将切换为简化的printf/scanf 代码,从而节省大约 10kB 的代码。 p>

    【讨论】:

    • 这是一个嵌入式系统,它以 UTC 计算所有内容,并且恰好不关心 tm_wdaytm_yday,所以 validate_structure 非常适合我的需要。但是你的另一个建议,-specs=nano.specs,更有吸引力,至少在我的闪光灯用完之前是这样。它在.elf 中甚至节省了 8,000 个字节,至少现在给了我足够的空间。谢谢!
    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多