rtic/book/en/archive/by_example/tips/from_ram.md

46 lines
1.7 KiB
Markdown
Raw Normal View History

2021-09-22 13:22:45 +02:00
# Running tasks from RAM
2023-02-01 21:21:31 +01:00
The main goal of moving the specification of RTIC applications to attributes in RTIC v0.4.0 was to allow inter-operation with other attributes. For example, the `link_section` attribute can be applied to tasks to place them in RAM; this can
2021-09-22 13:22:45 +02:00
improve performance in some cases.
2023-02-01 21:21:31 +01:00
> **IMPORTANT**: In general, the `link_section`, `export_name` and `no_mangle` attributes are powerful but also easy to misuse. Incorrectly using any of these attributes can cause undefined behavior; you should always prefer to use safe, higher level attributes around them like `cortex-m-rt`'s `interrupt` and `exception` attributes.
2021-09-22 13:22:45 +02:00
>
2023-02-01 21:21:31 +01:00
> In the particular case of RAM functions there's no safe abstraction for it in `cortex-m-rt` v0.6.5 but there's an [RFC] for adding a `ramfunc` attribute in a future release.
2021-09-22 13:22:45 +02:00
[RFC]: https://github.com/rust-embedded/cortex-m-rt/pull/100
The example below shows how to place the higher priority task, `bar`, in RAM.
```rust,noplayground
{{#include ../../../../../examples/lm3s6965/examples/ramfunc.rs}}
2021-09-22 13:22:45 +02:00
```
Running this program produces the expected output.
```console
$ cargo xtask qemu --verbose --example ramfunc
2023-02-01 21:21:31 +01:00
```
```console
{{#include ../../../../../ci/expected/lm3s6965/ramfunc.run}}
2021-09-22 13:22:45 +02:00
```
One can look at the output of `cargo-nm` to confirm that `bar` ended in RAM
(`0x2000_0000`), whereas `foo` ended in Flash (`0x0000_0000`).
```console
2021-09-22 13:22:45 +02:00
$ cargo nm --example ramfunc --release | grep ' foo::'
```
```console
{{#include ../../../../../ci/expected/lm3s6965/ramfunc.run.grep.foo}}
2023-02-01 21:21:31 +01:00
```
```console
2023-02-01 21:21:31 +01:00
$ cargo nm --example ramfunc --target thumbv7m-none-eabi --release | grep '*bar::'
```
```console
{{#include ../../../../../ci/expected/lm3s6965/ramfunc.run.grep.bar}}
2021-09-22 13:22:45 +02:00
```