我正试图将大量的代码塞进一个相当小的ARM微控制器中。我已经在尺寸优化方面做了大量的工作,我需要双倍算法,但是__aeabi_ddiv、__aeabi_dadd和__aeabi_dsub是整个设备上最大的功能之一。
__aeabi_dadd和__aeabi_dsub都是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呢?
谢谢!
发布于 2021-01-11 08:34:56
对我来说,解决方案(如@artless噪声所建议的)是使用 compiler flag。GCC有话要说:
断言编译的目标是独立的环境..。独立的环境是标准库可能不存在的环境,程序启动不一定主要在其中。最明显的例子是操作系统内核。
所以对嵌入式环境来说似乎很有意义.
这增加了大约250个字节到固件大小(大约0.1%),因为我想它停止了编译器利用一些关于内置操作符的假设,但是它确实允许我添加我自己的__aeabi_dsub实现,总共节省了1680字节。
https://stackoverflow.com/questions/52428872
复制相似问题