Rust方案初验证

Rust的std库

RUST的标准库包括:

img

在嵌入式系统中,比较有用的是 corealloc

虽然在嵌入式环境中,可以通过 #![feature(restricted_std)] 强行使用Rust的std库, 但随着功能的增加,问题也会越来越多,故转向使用 #![no_std]

编译

.cargo/config.toml 增加编译:

[unstable]
build-std = ["core", "alloc"]

global_allocator

可用来实现自己的内存分配函数的属性,可参考文档std::alloc

lib.rs上可以搜索到newlib-alloc,可直接用。

Cargo.toml 中增加

[dependencies]
libc = "0.2"
newlib-alloc = "0.1"
libc-print = "0.1"

编译libc时需要条件选择 newlib ,在 .cargo/config 增加:

[build]
rustflags = [
  "--cfg", "unix",
  "--cfg", "target_env=\"newlib\"",
]

编写测试代码

#![no_std]
#![feature(alloc_error_handler)]

use core::panic::PanicInfo;
#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
    loop {}
}

use newlib_alloc;
#[global_allocator]
static GLOBAL_ALLOCATOR: newlib_alloc::Alloc = newlib_alloc::Alloc;

#[alloc_error_handler]
fn alloc_error_handler(_layout: core::alloc::Layout) -> ! {
    loop {}
}

use libc_print::std_name::println;

extern crate alloc;
use alloc::vec::Vec;

#[no_mangle]
pub unsafe extern "C" fn rust_main() {
    let mut v = Vec::new();
    v.push(1);
    v.push(2);
    v.push(3);
    v.push(4);
    println!("RUST XWOS!");
    for x in v.iter() {
        println!("x: {}", x);
    }
}
  • 串口终端输出

img

  • 调试过程

img

测试环境

硬件环境

  • WeActMiniStm32H750
  • MCU:STM32H750
  • 说明:此工程已对接好newlib(如 malloc()printf() 等标准函数),可为Rust的库提供底层支持。

调试环境

  • IDE:STM32CubeIDE
  • 需要增加Rust插件:Corrosion: Rust edition in Eclipse IDE

实验代码

  • 代码仓库: git clone --recursive https://gitee.com/xwos/WeActMiniStm32H750.git
  • commit
cd XWOS
git pull
git checkout -b rust-bringup f8fcad24daa4912e4de0886c30e02343b6045dab