#card10 #l0dable #ccc #cc-camp19 #cc-camp2019

nightly no-std card10-alloc

card10可加载对象的动态内存分配

2个版本

0.1.1 2019年9月8日
0.1.0 2019年9月3日

#348 in 内存管理

MIT/Apache

19MB
197K 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 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 Rust 160 SLoC // 0.0% 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,我们为您构建了可以放入card10徽章的.elf文件。

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

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)。

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 将静态图像绘制到显示器的示例

杂项

如何更新固件绑定

  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:

支持动态分配的内存

重现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);
}

依赖关系