赞
踩
上一篇文章我们成功跑起了第一个由 Rust 驱动的 Blinky,可以说已经一只脚踏入嵌入式开发的大门了。但是读者如果跟着步骤实践会发现,从编译到烧录运行,整个流程的命令行存在大段的参数,而且GDB
的启动指令重复枯燥。因此,指南第二章将介绍一些技巧来简化整个流程,然后实践一些在嵌入式系统中的调试方法。
首先我们来回顾下编译 Rust 源码的命令:
> cargo build --target thumbv7m-none-eabi
这里的编译目标可以换用 .cargo/config
来指定。在项目目录新建文件夹 .cargo
并新建文件 config
, 写入:
- [build]
- target = "thumbv7m-none-eabi"
之前我们使用 rustup
添加的几个目标平台其实是对应了几个不同的 Cortex
指令集,它们的对应关系是:
- Target | Architecture
- ------------------------------------------------------------
- thumbv6m-none-eabi | Cortex-M0 and Cortex-M0+
- thumbv7m-none-eabi | Cortex-M3
- thumbv7em-none-eabi | Cortex-M4 and Cortex-M7 (no FPU)
- thumbv7em-none-eabihf | Cortex-M4F and Cortex-M7F (with FPU)
STM32F103
的架构为 Cortex-M3
,所以这里我们指定的是 thumbv7m-none-eabi
。
另外,如果不指定链接器,rustc
会使用默认的 LLD
进行链接,然而 LLD
并不能完全兼容嵌入式指令集,因此编译的可执行文件会丢失调试符号。为了之后能够使用 GDB
进行调试,我们这里将链接器指定为 gcc
,修改 .cargo/config
:
- [build]
- target = "thumbv7m-none-eabi"
-
- [target.thumbv7m-none-eabi]
- rustflags = [
- "-C", "linker=arm-none-eabi-gcc",
- "-C", "link-arg=-Wl,-Tlink.x",
- "-C", "link-arg=-nostartfiles",
- ]
现在就可以直接使用 cargo build
指令了:
- > cargo build
- Compiling blinky v0.1.0
- Finished dev [unoptimized + debuginfo]
上一章启动 openocd
的命令:
> openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg
为了简化,我们在项目目录里新建文件 openocd.cfg
,写入:
- source [find interface/stlink-v2.cfg]
- source [find target/stm32f1x.cfg]
之后要在这个项目目录里启动 openocd
,只需要简单地:
- > openocd
- 64-bits Open On-Chip Debugger 0.10.0-dev-00289-g5eb5e34 (2016-09-03-09:40)
- Licensed under GNU GPL v2
-
- ...
-
- Info : stm32f1x.cpu: hardware
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。