book: add an example of conditional compilation of resources and tasks

This commit is contained in:
Jorge Aparicio 2018-12-16 20:56:57 +01:00
parent 06c1e2f9b4
commit 34e74f4bb3
3 changed files with 70 additions and 0 deletions

View file

@ -20,6 +20,20 @@ rewrite code. If you consistently use `lock`s to access the data behind shared
resources then your code will continue to compile when you change the priority resources then your code will continue to compile when you change the priority
of tasks. of tasks.
## Conditional compilation
You can use conditional compilation (`#[cfg]`) on resources (`static [mut]`
items) and tasks (`fn` items). The effect of using `#[cfg]` attributes is that
the resource / task will *not* be injected into the prelude of tasks that use
them (see `resources`, `spawn` and `schedule`) if the condition doesn't hold.
The example below logs a message whenever the `foo` task is spawned, but only if
the program has been compiled using the `dev` profile.
``` rust
{{#include ../../../examples/cfg.rs}}
```
## Running tasks from RAM ## Running tasks from RAM
The main goal of moving the specification of RTFM applications to attributes in The main goal of moving the specification of RTFM applications to attributes in

View file

@ -68,6 +68,8 @@ main() {
generics generics
ramfunc ramfunc
cfg
) )
for ex in ${exs[@]}; do for ex in ${exs[@]}; do

54
examples/cfg.rs Normal file
View file

@ -0,0 +1,54 @@
//! examples/cfg.rs
#![deny(unsafe_code)]
#![deny(warnings)]
#![no_main]
#![no_std]
extern crate panic_semihosting;
#[cfg(debug_assertions)]
use cortex_m_semihosting::hprintln;
use rtfm::app;
#[app(device = lm3s6965)]
const APP: () = {
#[cfg(debug_assertions)] // <- `true` when using the `dev` profile
static mut COUNT: u32 = 0;
#[init]
fn init() {
// ..
}
#[task(priority = 3, resources = [COUNT], spawn = [log])]
fn foo() {
#[cfg(debug_assertions)]
{
*resources.COUNT += 1;
spawn.log(*resources.COUNT).ok();
}
// this wouldn't compile in `release` mode
// *resources.COUNT += 1;
// ..
}
#[cfg(debug_assertions)]
#[task]
fn log(n: u32) {
hprintln!(
"foo has been called {} time{}",
n,
if n == 1 { "" } else { "s" }
)
.ok();
}
extern "C" {
fn UART0();
fn UART1();
}
};