blob: 501a27215d8b907c849df2dc0fdabc854656bd9e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
# Writing a Rust Dynamic Library Usable by RT-Thread
1. Set up the project
Create a new `cargo` project as usual. There are some flags to tell `cargo` to generate a system library instead of a regular Rust target.
```toml
[lib]
name = "your_crate"
crate-type = ["cdylib"] # generate a dynamic library
# crate-type = ["staticlib"] # generate a static library
```
Add the following to `config.toml` to specify the target platform:
```toml
[build]
target = "your_target"
```
2. Enable RT-Thread dynamic module loading
To load dynamic modules in RT-Thread, enable it in `Kconfig`:
```
RT-Thread Components → C/C++ and POSIX layer
→ POSIX (Portable Operating System Interface) layer
→ Enable dynamic module APIs, dlopen()/dlsym()/dlclose() etc
```
3. Enable the filesystem
To place dynamic modules into RT-Thread, enable a filesystem in `Kconfig`:
```
RT-Thread online packages → system packages
→ lwext4: an excellent choice of ext2/3/4 filesystem for microcontrollers.
```
## Using the rust library
Add `rt_rust` dependency in `Cargo.toml`:
```toml
[dependencies]
rt_rust = { path = "PATH/TO/rust/rt-rust" }
```
Currently the macro-main library is not supported because it causes entry detection issues.
## References
- [The Embedded Rust Book](https://xxchang.github.io/book/interoperability/rust-with-c.html#extern-c)
|