首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ARM嵌入式锈蚀中实现内存少的模块化

如何在ARM嵌入式锈蚀中实现内存少的模块化
EN

Stack Overflow用户
提问于 2019-11-26 15:19:38
回答 1查看 273关注 0票数 2

我有一个嵌入式项目在锈蚀上的STM32F446单片机。考虑下一行:

代码语言:javascript
运行
复制
leds::set_g(self.next_update_time % 2000 == 0)

模块被使用并在线阅读,似乎Cortex M4没有模块化指令。相反,函数被添加到在软件中执行此操作的二进制文件中。使用货物膨胀(基于谷歌的臃肿),它可以找到。

代码语言:javascript
运行
复制
File  .text    Size                 Crate Name
...
0.1%   6.9%    990B     compiler_builtins __udivmoddi4
...

令我惊讶的是,它只需要不到一千字节的记忆。我想那是很多。它背后的代码也很长,参见链接。我认为这个实现是快速的。幸运的是,我有足够的记忆。

使用opt-level = 'z'不会改变这一点。

但是如果我负担不起这个,我怎么能让它占用更少的记忆呢?

当然,诉诸像这样的解决方案是可行的,但是这样我就失去了使用%操作符的能力。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-26 16:05:21

不确定Rust链接器有多聪明,但是在许多嵌入式链接器实现中,您可以在自己的__udivmodi4实现中进行交换,它比编译器提供的版本更小(但更慢)。

一般说来,在嵌入式平台上,泛型除法和模块化很昂贵,但常量除法通常可以通过智能编译器的“固定”实现进行专门化(通常具有通用除数的特例-- 3、5、7、10等)。

如果您可以控制应用程序,那么通过2^N将代码更改为除法或模块化显然更可取(它可以折叠为“右移”指令表示“除法”,或者改为“和”指令用于模块化)。例如,在这种情况下,2048可能接近2000年,并将1 KB的代码转换为4字节的代码。

FWIW的锈蚀版本看起来确实有点胖--例如,GCC实施要小得多。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59054054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档