gpt4 book ai didi

c - 替换 __aeabi_dsub 以节省空间(-flto 问题)

转载 作者:行者123 更新时间:2023-12-04 11:34:13 27 4
gpt4 key购买 nike

我试图将大量代码塞进一个相当小的 ARM 微 Controller 中。我已经在大小优化方面做了大量工作,而且我已经到了需要双重算术的地步,但是 __aeabi_ddiv , __aeabi_dadd__aeabi_dsub是整个设备上一些最大的功能。

两者 __aeabi_dadd__aeabi_dsub尽管做基本相同的工作( double 的最高位是符号位),但每个都是 ~1700 字节。两个函数都没有引用另一个函数。

实际上我需要做的就是替换 __aeabi_dsub和:

double __aeabi_dsub(double a, double b) {
// flip top bit of 64 bit number (the sign bit)
((uint32_t*)&b)[1] ^= 0x80000000; // assume little endian
return a + b;
}

我会节省大约 1700 字节 - 所以翻转第二个参数的符号,然后使用 __aeabi_dadd 添加它们.

我知道这可能不是 100% 与 IEEE 规范兼容,但在这个平台上我没问题,以便节省 > 1% 的可用闪存。

我的问题是,当我添加该函数时,链接器会提示 undefined reference to __aeabi_dsub - 鉴于是定义它的行为导致了错误,这似乎很奇怪。

这似乎与链接时间优化( -flto )有关 - 将其关闭意味着一切正常,但是它增加了 8k 的固件大小,使其不再适合可用的闪存!

那么我需要做什么才能替换内置函数 __aeabi_dsub链接时间优化何时处于事件状态?

谢谢!

最佳答案

我的解决方案(如@artless-noise 所建议的)是使用 -ffreestanding compiler flag .海湾合作委员会对此有话要说:

Assert that compilation targets a freestanding environment... A freestanding environment is one in which the standard library may not exist, and program startup may not necessarily be at main. The most obvious example is an OS kernel.


因此,无论如何,对于嵌入式环境似乎很有意义......
这为固件大小增加了大约 250 个字节(大约 0.1%),因为我猜它阻止了编译器利用有关内置运算符的一些假设,但是它确实允许我添加我自己的 __aeabi_dsub实现,总共节省了 1680 个字节。

关于c - 替换 __aeabi_dsub 以节省空间(-flto 问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52428872/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com