26 个版本 (13 个破坏性更新)
0.14.0 | 2024年2月25日 |
---|---|
0.13.0 | 2023年8月13日 |
0.12.1 | 2022年5月10日 |
0.12.0 | 2022年1月30日 |
0.4.0 | 2018年9月30日 |
#67 在 嵌入式开发 中排名
79 每月下载量
在 fll-rs 中使用
190KB
3K SLoC
Rust 语言的 ev3dev 绑定
注意
要使用此项目与 BrickPi 平台一起使用,必须启用相应的功能。功能 ev3
、brickpi
和 brickpi3
是互斥的。
[dependencies]
ev3dev_lang_rust = { version="0.13.0" default-features=false, features=["brickpi"] }
用法
extern crate ev3dev_lang_rust;
use ev3dev_lang_rust::Ev3Result;
use ev3dev_lang_rust::motors::{LargeMotor, MotorPort};
use ev3dev_lang_rust::sensors::ColorSensor;
fn main() -> Ev3Result<()> {
// Get large motor on port outA.
let large_motor = LargeMotor::get(MotorPort::OutA)?;
// Set command "run-direct".
large_motor.run_direct()?;
// Run motor.
large_motor.set_duty_cycle_sp(50)?;
// Find color sensor. Always returns the first recognized one.
let color_sensor = ColorSensor::find()?;
// Switch to rgb mode.
color_sensor.set_mode_rgb_raw()?;
// Get current rgb color tuple.
println!("Current rgb color: {:?}", color_sensor.get_rgb()?);
Ok(())
}
有一个 模板仓库,其中包含为此 "Hello World" 示例进行交叉编译和性能/二进制大小优化的所有必需配置。
支持的功能
- 电机
LargeMotor
[lego-ev3-l-motor
、lego-nxt-motor
]MediumMotor
lego-ev3-m-motor
TachoMotor
:围绕LargeMotor
和MediumMotor 的有用包装器,以简化常用函数的使用
- 传感器
ColorSensor
lego-ev3-color
CompassSensor
ht-nxt-compass
GyroSensor
lego-ev3-gyro
InfraredSensor
lego-ev3-ir
IrSeekerSensor
ht-nxt-ir-seek-v2
LightSensor
lego-nxt-light
TouchSensor
[lego-ev3-touch
、lego-nxt-touch
]UltrasonicSensor
[lego-ev3-us
、lego-nxt-us
]
- 实用工具
Button
:提供对 ev3 砖上集成按钮的访问Led
:提供对ev3砖块上集成LED的访问PowerSupply
:提供对电源信息的访问Screen
:提供对ev3砖块上集成显示的访问sound
:提供对ev3砖块上集成扬声器的访问
ev3机器人的交叉编译 - 使用musl
工具链
-
安装
armv5te-musl
工具链rustup target add armv5te-unknown-linux-musleabi
-
创建包含以下内容的
.cargo/config.toml
[build] target = "armv5te-unknown-linux-musleabi" [target.armv5te-unknown-linux-musleabi] linker = "rust-lld"
-
构建二进制文件
cargo build --release
--release
标志是可选的。然而,它可以以30倍的速度加快执行时间。目标二进制文件现在位于target/armv5te-unknown-linux-musleabi/release/{application_name}
。
使用docker的ev3机器人交叉编译
如果您需要交叉编译其他依赖项(例如openssl
或paho-mqtt
),使用完整的交叉编译工具链会更容易。为此,您可以使用提供的docker镜像pixix4/ev3dev-rust:latest
。
-
设置docker环境
-
创建包含以下内容的
.cargo/config.toml
[build] target = "armv5te-unknown-linux-gnueabi" [target.armv5te-unknown-linux-gnueabi] linker = "/usr/bin/arm-linux-gnueabi-gcc"
-
构建二进制文件
docker run --rm -it -v $(pwd):/build -w /build pixix4/ev3dev-rust:latest \ cargo build --release
--release
标志是可选的。然而,它可以以30倍的速度加快执行时间。目标二进制文件现在位于target/armv5te-unknown-linux-gnueabi/release/{application_name}
。如果您这样做,您会注意到每次构建都会在
Updating crates.io index
上长时间停滞。为了加快这一步骤,您可以使用cargo的vendoring机制。cargo vendor
执行上述命令,并将以下额外的配置添加到
.cargo/config
[source.crates-io] replace-with = "vendored-sources" [source.vendored-sources] directory = "vendor"
优化二进制文件大小
-
启用“fat”链接时间优化和剥离调试符号:默认情况下,rust只为每个crate执行lto。要启用全局lto(这将导致更彻底的无效代码消除),请将以下额外的配置添加到您的
Cargo.toml
。这还会从二进制文件中删除额外的调试符号。通过这种方式,您可以减少“Hello World”示例的二进制文件大小超过90%。[profile.release] lto = true strip = "debuginfo"
strip选项需要rust
1.59.0
。如果您使用的是较旧版本,您可以使用docker手动完成此操作# Run in interactive docker shell docker run -it --rm -v $(PWD):/build/ -w /build pixix4/ev3dev-rust /usr/bin/arm-linux-gnueabi-strip /build/target/armv5te-unknown-linux-gnueabi/release/{application_name} # Run directly (e.g. via Makefile) docker run --rm -v $(PWD):/build/ -w /build pixix4/ev3dev-rust \ /usr/bin/arm-linux-gnueabi-strip /build/target/armv5te-unknown-linux-gnueabi/release/{application_name}
编辑器支持
如果您在使用rust analyzer时遇到代码补全或内联文档问题,启用以下设置可能会有所帮助
{
"rust-analyzer.cargo.loadOutDirsFromCheck": true,
"rust-analyzer.procMacro.enable": true
}
(来自VSCode的示例 settings.json
)
docs.rs文档
要构建完整的文档(包括screen
功能),请使用
RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --features ev3,screen
依赖项
~1.2–4.5MB
~48K SLoC