2个版本
0.1.1 | 2019年9月8日 |
---|---|
0.1.0 | 2019年9月3日 |
#348 in 内存管理
19MB
197K SLoC
Rust支持card10 CCCamp19徽章
准备您的card10
无需越狱!
从固件v1.9开始,运行ELF二进制文件需要包含以下内容的 /card10.cfg
execute_elf=true
预构建的二进制文件
感谢Gitlab的CI系统和NixOS,我们为您构建了可以放入card10徽章的.elf
文件。
对于此存储库中的每个提交,我们还构建了包含所需配置和示例二进制文件的完整固件镜像。
https://git.card10.badge.events.ccc.de/astro/rust-card10/-/jobs
先决条件
您需要Rust nightly版本和一个用于编译card10固件(包括匹配的libc)的完整设置。
-
有关如何设置rust的说明,请参阅https://rustup.rs。
请确保您已安装最新的rust nightly工具链,并添加
thumbv7em-none-eabi
目标。rustup toolchain install nightly rustup update rustup target add thumbv7em-none-eabi --toolchain nightly
-
有关如何设置card10固件的说明,请查看https://firmware.card10.badge.events.ccc.de/how-to-build.html 中的依赖章节。
-
此外,您可能还需要 llvm和libc i386 dev头文件的软件包。
-
使用
--recursive
克隆此存储库以获取子模块,否则稍后更新它们git submodule update --init --recursive
构建和运行Rust可加载对象
设置
如果您想创建自己的基于rust的可加载对象crate,则需要做一些准备工作
-
设置新的crate存储库。
-
将
card10-l0dable = "^0.1"
作为依赖项添加到您的新的crate中。 -
更改您的
Cargo.toml
文件中默认的cargo发布配置[profile.release] opt-level = "s" panic = "abort"
-
在
$PROJECT/.cargo/config
中创建(或更新)thumbv7em-none-eabi
目标配置,并使用以下rustflags[target.thumbv7em-none-eabi] rustflags = [ "-C", "linker=arm-none-eabi-gcc", "-C", "link-args=-Tl0dable.ld -n -pie -fPIC", "-C", "relocation-model=pic", ] [build] target = "thumbv7em-none-eabi"
-
确保您的仓库被标记为
non_std
项目,并让card10-l0dable
知道您的自定义主函数。这需要对您的main.rs
文件进行以下更新。#![no_std] #![no_main] use card10_l0dable::main; main!(main); fn main() {}
编译
使用夜间工具链并定义正确的目标来编译项目。
cargo +nightly build --release --target thumbv7em-none-eabi
转移到card10
然后从目标目录target/thumbv7em-none-eabi/release/example
复制生成的可执行文件到您的徽章的apps
目录。
注意:需要将可执行文件重命名为添加elf
扩展名(例如,example
必须重命名为example.elf
)。
Crates
Crate | 文档 | 描述 |
---|---|---|
card10-sys | docs.rs | l0dables的不可安全C绑定 |
card10-alloc | docs.rs | 为l0dables提供alloc::*支持 |
card10-l0dable | docs.rs | 构建l0dables的高级crate |
example | l0dable示例 | |
rkanoid | Arkanoid克隆 | |
draw-image | 将静态图像绘制到显示器的示例 |
杂项
如何更新固件绑定
-
更新
card10-sys/firmware
子模块到最新的固件状态。 -
如上所述重新构建固件。
-
从项目根目录运行以下脚本
python card10-sys/firmware/epicardium/api/genapi.py -H card10-sys/firmware/epicardium/epicardium.h -c card10-sys/vendor/client.c -s card10-sys/vendor/server.c
-
重新构建您的应用程序 :)
lib.rs
:
支持动态分配的内存
重现l0dable硬件.c的_sbrk()
不幸的是,我们无法直接链接_sbrk(),因为它引用了难以处理的`errno`。
示例
#![no_std]
#![no_main]
extern crate alloc;
use alloc::vec;
use card10_l0dable::*;
main!(main);
fn main() {
// Pass stack headroom
card10_alloc::init(128 * 1024);
let mut xs = vec![];
xs.push(23);
}