Gcc arm时间二进制大小
我需要从Gcc arm时间二进制大小,gcc,arm,stm32,newlib,Gcc,Arm,Stm32,Newlib,我需要从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_小时现在是1小时 //t.tm_min现在为0 //t.tm_秒现在是10 我在一个有32KB闪存的STM32上做这个,二进制文件变得非常大mktime(3)而它所拉入的其他东西
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_小时现在是1小时
//t.tm_min现在为0
//t.tm_秒现在是10
我在一个有32KB闪存的STM32上做这个,二进制文件变得非常大mktime(3)
而它所拉入的其他东西占用了16KB的闪存空间——是可用空间的一半
newlib中是否有专门负责
struct tm
规范化的函数?我意识到,链接到这样的私有函数会使代码的可移植性降低。在newlib/libc/time/mktime.c
中有一个validate_structure()
函数,它完成部分工作,将月、月、小时、分钟、秒标准化,但将周和年中的某一天单独保留
它被声明为静态
,因此您不能简单地调用它,但可以从源代码复制函数。(不过可能存在许可问题)。或者你可以重新实现它,这很简单
tm_-wday
和tm_-yday
稍后将在mktime()
中计算,因此您需要包括时区内容在内的整个混乱,以便对这两个进行规范化
该16kB代码的大部分与调用siscanf()
有关,它是sscanf()的一个变体,不支持浮点,我相信它用于解析环境变量中的时区和DST信息
通过链接时使用--specs=nano.specs
可以剪切大量不必要的代码,这将切换到简化的printf
/
代码,在您的案例中节省大约10kB的代码。这是一个嵌入式系统,可以在UTC中计算所有内容,而且碰巧不关心tm_wday
和tm_yday
,所以validate_结构
非常适合我的需要。但是你的另一个建议,-specs=nano.specs
,甚至更具吸引力,至少在我用完flash之前是这样。它在.elf
中甚至节省了8000字节,至少现在我有足够的空间。非常感谢。