Rust STM32F103嵌入式开发教程之编译与烧录2

调试模式编译

# Package app/blinky
cargo build -p blinky

生产环境编译

# Package app/blinky
cargo build -r -p blinky

生产环境 HEX 格式编译

cargo objcopy --release -p blinky -- -O binary blinky.hex

开发板调试

embed 工具调试

使用 embed 进行调试时,需要调整一下配置。

  • 调整配置
cd .cargo

cp config_embed.toml config.toml
  • 烧录
cargo embed --target thumbv7m-none-eabi -p flash_tool_embed

probe-run 工具调试

使用 probe-run 进行调试时,需要调整一下配置。

  • 调整配置
cd .cargo
cp config_defmt.toml config.toml
  • 烧录 bin 文件
# 完整指令
cargo run --target thumbv7m-none-eabi -p blinky probe-run -- --chip STM32F103C8

# 简写, 配置的有 `.cargo/config.toml` 文件
cargo run -p blinky
# 别名
cargo rp blinky
  • 烧录 HEX 文件 (未验证)
# 编译
cargo objcopy --release --target thumbv7m-none-eabi --offline -p blinky -- -O binary blinky.hex
cargo objcopy -p blinky -- -O binary blinky.hex

# 烧录
sudo mono avrdudess.exe

检查 ELF

现在在 target/thumbv7m-none-eabi/debug/blinky 中有一个非主机环境的 ELF 二进制文件。我们能使用 cargo-binutils 检查它。

使用 cargo-readobj 我们能打印 ELF 头,确认这是一个 ARM 二进制。

cargo readobj -p blinky -- --file-headers

注意:

-p blinky 是一个用来查看二进制项 target/$TRIPLE/debug/blinky 的语法糖

-p blinky 需要时也会重新编译二进制项。

ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x8000131
  Start of program headers:          52 (bytes into file)
  Start of section headers:          2850820 (bytes into file)
  Flags:                             0x5000200
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         5
  Size of section headers:           40 (bytes)
  Number of section headers:         23
  Section header string table index: 21

检查二进制项的 linker section 的大小

cargo size -p blinky --release -- -A

我们使用 --release 查看优化后的版本

blinky  :
section              size        addr
.vector_table         304   0x8000000
.text                 376   0x8000130
.rodata                44   0x80002a8
.data                   0  0x20000000
.gnu.sgstubs            0   0x80002e0
.bss                    4  0x20000000
.uninit                 0  0x20000004
.debug_loc            557         0x0
.debug_abbrev        1855         0x0
.debug_info         45223         0x0
.debug_aranges        504         0x0
.debug_ranges         304         0x0
.debug_str          40309         0x0
.debug_pubnames     21424         0x0
.debug_pubtypes     19774         0x0
.ARM.attributes        50         0x0
.debug_frame          680         0x0
.debug_line          3738         0x0
.comment               19         0x0
Total              135165

ELF linker sections 的介绍

  • .text 包含程序指令
  • .rodata 包含像是字符串这样的常量
  • .data 包含静态分配的初始值非零的变量
  • .bss 也包含静态分配的初始值是零的变量
  • .vector_table 是一个我们用来存储向量(中断)表的非标准的 section
  • .ARM.attributes 和 .debug_* sections 包含元数据,当烧录二进制文件时,它们不会被加载到目标上。

重要

ELF 文件包含像是调试信息这样的元数据,因此它们在硬盘上的尺寸没有正确地反应处程序被烧录到设备上时将占据的空间的大小。要一直使用 cargo-size 检查一个二进制项的大小。

反编译二进制项

cargo objdump -p blinky --release -- --disassemble --no-show-raw-insn --print-imm-hex

链接器脚本编译

cargo rustc -- -C link-arg=-Tlink.x

参考文档

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值