我有一个嵌入式项目在锈蚀上的STM32F446单片机。考虑下一行:
leds::set_g(self.next_update_time % 2000 == 0)模块被使用并在线阅读,似乎Cortex M4没有模块化指令。相反,函数被添加到在软件中执行此操作的二进制文件中。使用货物膨胀(基于谷歌的臃肿),它可以找到。
File .text Size Crate Name
...
0.1% 6.9% 990B compiler_builtins __udivmoddi4
...令我惊讶的是,它只需要不到一千字节的记忆。我想那是很多。它背后的代码也很长,参见这链接。我认为这个实现是快速的。幸运的是,我有足够的记忆。
使用opt-level = 'z'不会改变这一点。
但是如果我负担不起这个,我怎么能让它占用更少的记忆呢?
当然,诉诸像这这样的解决方案是可行的,但是这样我就失去了使用%操作符的能力。
发布于 2019-11-26 16:05:21
不确定Rust链接器有多聪明,但是在许多嵌入式链接器实现中,您可以在自己的__udivmodi4实现中进行交换,它比编译器提供的版本更小(但更慢)。
一般说来,在嵌入式平台上,泛型除法和模块化很昂贵,但常量除法通常可以通过智能编译器的“固定”实现进行专门化(通常具有通用除数的特例-- 3、5、7、10等)。
如果您可以控制应用程序,那么通过2^N将代码更改为除法或模块化显然更可取(它可以折叠为“右移”指令表示“除法”,或者改为“和”指令用于模块化)。例如,在这种情况下,2048可能接近2000年,并将1 KB的代码转换为4字节的代码。
FWIW的锈蚀版本看起来确实有点胖--例如,GCC实施要小得多。
https://stackoverflow.com/questions/59054054
复制相似问题