Macro cortex_m_rtfm::tasks [] [src]

macro_rules! tasks {
    ($device:ident, {
        $($task:ident: Task {
            interrupt:$Interrupt:ident,
            priority: $P:ident,
            enabled: $enabled:expr,
        },)*
    }) => { ... };
}

A macro to declare tasks

NOTE This macro will expand to a main function.

Each $task is bound to an $Interrupt handler and has a priority $P. The minimum priority of a task is P1. $enabled indicates whether the task will be enabled before idle runs.

The $Interrupt handlers are defined in the $device crate.

Apart from defining the listed $tasks, the init and idle functions must be defined as well. init has signature fn(P0, &TMax), and idle has signature fn(P0) -> !.

Example

#[feature(used)]
#[no_std]

extern crate cortex_m_rt;
#[macro_use]
extern crate cortex_m_rtfm as rtfm;
// device crate generated using `svd2rust`
extern crate stm32f30x;

use rtfm::{P0, P1, P2, T0, T1, T2, TMax};
use stm32f30x::interrupt::{Exti0, Tim7};

tasks!(stm32f30x, {
    periodic: Task {
        interrupt: Tim7,
        priority: P1,
        enabled: true,
    },
    button: Task {
        interrupt: Exti0,
        priority: P2,
        enabled: true,
    },
});

fn init(priority: P0, threshold: &TMax) {
    // ..
}

fn idle(priority: P0, threshold: T0) -> ! {
    // Sleep
    loop {
        rtfm::wfi();
    }
}

// NOTE signature must match the tasks! declaration
fn periodic(task: Tim7, priority: P1, threshold: T1) {
    // ..
}

fn button(task: Exti0, priority: P2, threshold: T2) {
    // ..
}