Rust врезанный размер двоичного файла - PullRequest
3 голосов
/ 24 сентября 2019

Я новичок в Rust, и после многих сражений с компилятором и средством проверки заимствований я наконец почти закончил свой первый проект.Но теперь у меня проблема в том, что двоичный файл становится большим, чтобы поместиться во флэш-память микроконтроллера.

Я использую STM32F103C8 со 64K-флэш-памятью на BluePill.Сначала я смог разместить код на 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 строк кода и, как я бы сказал, не очень необычные зависимости, это кажется странным.

Есть несколько сайтов, подобных это со способами минимизации двоичного файла.Поскольку они не предназначены для встроенных систем, большинство способов минимизации в любом случае выполняются.

Как я могу минимизировать двоичный размер и все еще могу отлаживать его?

Мои зависимости:

[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)

edit

Паника ржавчины прерывается.

Код можно просмотреть при: https://github.com/DarkPhoeniz/rc-switcher-rust

1 Ответ

4 голосов
/ 24 сентября 2019

Я столкнулся с похожими проблемами и, возможно, смогу пролить свет на то, что вы можете сделать, чтобы уменьшить размер двоичного файла, который вы выводите.

Вы уже обнаружили один из них:opt-level = "z".Разница между s и z заключается во встроенном ограничении - по сути, в размере функции, в которой компилятор считает, что вставлять не стоит.z указывает, что это 25, s 75. В зависимости от того, что вы строите, это может или не может быть последующим уменьшением размера (и это влияет в основном на .rodata и .text).

Другая вещь, на которой вы можете играть, это поведение panic в вашем коде.Если я правильно помню, цель stm32 поддерживает и unwind, и abort, с включенным unwind в профиле dev.Я уверен, вы понимаете, что разматывание стека - это большой и дорогостоящий процесс с точки зрения размера кода.Таким образом, установка panic = "abort" в вашем грузовом файле может немного уменьшить размер двоичного файла.

Помимо этого, речь идет о ручной настройке, и такие инструменты, как cargo-binutils могут бытьчрезвычайно полезно для этого.В зависимости от вашего варианта использования могут существовать Debug реализации, которые необходимы только время от времени, и это определенно то, что вы можете предпринять.

...