gpt4 book ai didi

Rust 嵌入式二进制大小

转载 作者:行者123 更新时间:2023-11-29 07:58:27 25 4
gpt4 key购买 nike

我是 Rust 的新手,在与编译器和借用检查器进行了多次斗争之后,我终于快完成了我的第一个项目。但现在我遇到了二进制文件变大以适应微 Controller 闪存的问题。

我在 BluePill 上使用带有 64K 闪存的 STM32F103C8。起初我能够在 mc 上安装代码,并且我必须一点一点地启用优化等。现在我编译:

[profile.dev]
codegen-units = 1
debug = 0
lto = true
opt-level = "z"

并且能够适应二进制文件。 opt-level = "s" 确实会生成一个很大的二进制文件。我得到的错误是:rust-lld: error: section '.rodata' will not fit in region 'FLASH': overflowed by 606 bytes

因为我的代码不到 1000 行,而且我会说没有那么不寻常的依赖关系,所以这看起来很奇怪。

有一些站点,例如 this有最小化二进制文件的方法。由于这些不适用于嵌入式,因此无论如何都会遵循大多数最小化方法。

我怎样才能最小化二进制文件的大小并仍然能够对其进行调试?

我的依赖项是:

[dependencies]
cortex-m = "*"
panic-halt = "*"
embedded-hal = "*"

[dependencies.cortex-m-rtfm]
version = "0.4.3"
features = ["timer-queue"]

[dependencies.stm32f1]
version = "*"
features = ["stm32f103", "rt"]

[dependencies.stm32f1xx-hal]
version = "0.4.0"
features = ["stm32f103", "rt"]

可能有问题,因为我注意到 cargo build 确实在不同版本中多次编译了一些子依赖项。

memory.x 文件中:

MEMORY
{
FLASH : ORIGIN = 0x08000000, LENGTH = 64K
RAM : ORIGIN = 0x20000000, LENGTH = 20K
}

Rustc 版本 rustc 1.37.0 (eae3437df 2019-08-13)

编辑

Rust panic 行为已中止。

代码可在以下位置查看:https://github.com/DarkPhoeniz/rc-switcher-rust

最佳答案

我遇到过类似的问题,或许可以阐明您可以采取哪些措施来减小输出的二进制文件的大小。

您已经发现了其中之一:opt-level = "z" . s之间的区别和 z是内联约束 - 本质上,编译器认为不值得内联的函数的大小。 z指定为 25,s 75. 根据您正在构建的内容,这可能会或可能不会导致尺寸减小(并且它主要影响 .rodata.text)。

您可以玩的另一件事是 panic 上的行为在你的代码上。如果我没记错的话,stm32目标同时支持 unwindabort , 与 unwinddev 上启用轮廓。正如我相信您能理解的那样,展开堆栈在代码大小方面是一个庞大且成本高昂的过程。因此,设置 panic = "abort"在您的 cargo 文件中可能会进一步减少二进制文件的大小。

除此之外,还需要手动调整,以及 cargo-binutils 等工具可能对此非常有用。根据您的用例,可能会有剩余的 Debug只是偶尔需要的实现,这绝对是您可以采取的行动。

关于Rust 嵌入式二进制大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58075821/

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