我是 Rust 的新手,在与编译器和借用检查器进行了多次战斗后,我终于快要完成我的第一个项目。但现在我遇到的问题是二进制文件太大了,无法适应微控制器的闪存。
我正在使用带有 64K 闪存的 BluePill 上的 STM32F103C8。起初,我的代码可以适应微控制器,渐渐地我不得不启用优化等功能。现在我使用以下方式进行编译:
[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行,而且依赖关系也不算特别复杂,所以这看起来有些奇怪。
有一些网站类似于这样的,介绍了一些最小化二进制文件的方法。由于这些方法并不是为嵌入式设备设计的,因此大多数最小化方法已经被采用了。
我该如何最小化二进制文件大小,同时仍然能够进行调试?
我使用的依赖项是:
[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"]
我注意到一个问题,可能存在的问题是会以不同版本多次编译某些子依赖项。
memory.x
文件内部:
MEMORY
{
FLASH : ORIGIN = 0x08000000, LENGTH = 64K
RAM : ORIGIN = 0x20000000, LENGTH = 20K
}
Rustc版本rustc 1.37.0 (eae3437df 2019-08-13)
编辑
Rust的panic行为是abort。
该代码可在以下网址查看:https://github.com/DarkPhoeniz/rc-switcher-rust
.rodata
表示您有太多/太大的常量,不一定是代码本身太大。但似乎.rodata
和.text
共享相同的段FLASH
,因此两者都可能是罪魁祸首。 - Lundinarm-none-eabi-size
的结果是text data bss dec hex
7424 332 112 7868 1ebc
- l4z6_z