3个版本 (破坏性)

0.3.0 2019年9月8日
0.2.0 2019年9月4日
0.1.1 2019年8月23日
0.1.0 2019年8月23日

#152 in 无标准库

MIT/Apache

19MB
198K SLoC

C 161K SLoC // 0.2% comments SWIG 9K SLoC // 0.2% comments M4 8K SLoC // 0.3% comments Shell 7.5K SLoC // 0.2% comments Visual Studio Project 5K SLoC GNU Style Assembly 2K SLoC // 0.2% comments Bitbake 1.5K SLoC // 0.3% comments Rust 1K SLoC // 0.0% comments Assembly 771 SLoC // 0.1% comments Arduino C++ 765 SLoC // 0.4% comments Automake 761 SLoC // 0.1% comments Python 169 SLoC // 0.4% comments Visual Studio Solution 139 SLoC Perl 96 SLoC // 0.2% comments INI 51 SLoC GDB Script 41 SLoC

Rust对card10 CCCamp19徽章的支持

准备您的card10

越狱不再是必要的!

从固件v1.9开始,运行ELF二进制文件需要一个包含以下内容的 /card10.cfg

execute_elf=true

预构建的二进制文件

由于Gitlab的CI系统和NixOS,我们为您构建了 .elf 文件,您可以将其放入card10徽章的 apps/ 目录。

对于此存储库中的每个提交,我们还构建了包含所需配置和示例二进制的完整固件镜像。

https://git.card10.badge.events.ccc.de/astro/rust-card10/-/jobs

先决条件

您需要Rust nightly和编译card10固件的配置,包括匹配的libc。

  1. 有关如何设置rust的说明,请参阅 https://rustup.rs.

    请确保已安装最新的rust nightly工具链并添加 thumbv7em-none-eabi 目标。

    rustup toolchain install nightly
    rustup update
    rustup target add thumbv7em-none-eabi --toolchain nightly
    
  2. 有关如何设置card10固件的说明,请查看 https://firmware.card10.badge.events.ccc.de/how-to-build.html 中的依赖关系章节。

  3. 此外,您可能还需要llvm和libc i386 dev头文件的包。

  4. 使用 --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)。

文档 描述
card10-sys docs.rs 为 l0dables 提供不安全的 C 绑定
card10-alloc docs.rs 为 l0dables 提供 alloc::* 支持
card10-l0dable docs.rs 用于构建 l0dables 的高级包
example l0dable 示例
rkanoid Arkanoid 复制品
draw-image 将静态图像绘制到显示屏的示例

杂项

如何更新固件绑定

  1. card10-sys/firmware 子模块更新到最新固件状态。

  2. 如上所述重新构建固件。

  3. 从项目根目录运行以下脚本

    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
    
  4. 重新构建你的应用程序 :)


lib.rs:

仓库

依赖

~2.5–4.5MB
~56K SLoC