rttrust 0.1.3

Rust wrapper for rt-thread
Documentation
# NUCLEO-F446ZE Rust Example


### How to configure your project to use Rust


#### Create rust crate


Create a rust crate under your project root folder

```bash
cargo new --lib CARGO_NAME
``` 

#### Add `SConscript`


Go to the created crate folder and create a `SConscript` file

```python
Import('RTT_ROOT')
Import('rtconfig')
from building import *

# change it if you want to use a different chip

llvm_target = 'thumbv7em-none-eabihf'

cargo = Builder(action = [
        'cargo build --manifest-path ${SOURCE.abspath} --target ${LLVM_TARGET} --target-dir ${TARGET.dir.abspath}',
        Copy('${TARGET.abspath}', '${TARGET.dir.abspath}/${LLVM_TARGET}/debug/${TARGET.file}')
    ],
    suffix = '.a',
    src_suffix = '.toml',
    prefix = 'lib',
    chdir = 1)

Env.Append(BUILDERS = {'Cargo' : cargo})
Env.AppendUnique(LLVM_TARGET = llvm_target)      

cwd = GetCurrentDir()
src = Glob('*.c')
CPPPATH = [cwd, ]

# 'rust_example' is ".a" file name

rttrust = Env.Cargo('rust_example', 'Cargo.toml')
Env.AlwaysBuild(rttrust)

group = DefineGroup('Rust', src, depend = [''], LIBS = [rttrust], CPPPATH = CPPPATH, LINKFLAGS = ' -z muldefs')

Return('group')
```

#### Add header file


C code need a header file to call rust code entry. The example uses `rust.h`:

```c
void rust_main();
```

#### Modify `Cargo.toml` file


In your `Cargo.toml` file, add `rttrust` in dependency section

```toml
[dependencies]
# path to rttrust cargo

rttrust = "^0"
```

If you want to [use local version](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#multiple-locations) of rttrust, add path to override

```toml
[dependencies]
# path to rttrust cargo

rttrust = { path = '../../../', version = "^0" }
```

To link with the final output, the crate type has to be `staticlib`

```toml
[lib]
crate-type = ["staticlib"]
```

Cuurently, rust has no way to support unwinding in `no_std` environment. So, we need to disable panic unwinding

```toml
[profile.dev]
panic = "abort"

[profile.release]
panic = "abort"
```

#### Modify `lib.rs` code


You need to start you code logic from `rust_main` function:

```rust
#![no_std]


// println! marco is defined in rttrust crate
#[macro_use]

extern crate rttrust;

// no mangle the name
#[no_mangle]

pub extern "C" fn rust_main() {
    println!("hello rust");
}
```