[][src]Attribute Macro cortex_m_rtfm_macros::app

#[app]

Attribute used to declare a RTFM application

This attribute must be applied to a const item of type (). The const item is effectively used as a mod item: its value must be a block that contains items commonly found in modules, like functions and static variables.

The app attribute has one mandatory argument:

The items allowed in the block value of the const item are specified below:

1. static [mut] variables

These variables are used as resources. Resources can be owned by tasks or shared between them. Tasks can get &mut (exclusives) references to static mut resources, but only & (shared) references to static resources. Lower priority tasks will need a lock to get a &mut reference to a static mut resource shared with higher priority tasks.

static mut resources that are shared by tasks that run at different priorities need to implement the Send trait. Similarly, static resources that are shared by tasks that run at different priorities need to implement the Sync trait.

Resources can be initialized at runtime by assigning them () (the unit value) as their initial value in their declaration. These "late" resources need to be initialized an the end of the init function.

The app attribute will inject a resources module in the root of the crate. This module contains proxy structs that implement the Mutex trait. The struct are named after the static mut resources. For example, static mut FOO: u32 = 0 will map to a resources::FOO struct that implements the Mutex<Data = u32> trait.

2. fn

Functions must contain one of the following attributes: init, idle, interrupt, exception or task. The attribute defines the role of the function in the application.

a. #[init]

This attribute indicates that the function is to be used as the initialization function. There must be exactly one instance of the init attribute inside the app pseudo-module. The signature of the init function must be [unsafe] fn ().

The init function runs after memory (RAM) is initialized and runs with interrupts disabled. Interrupts are re-enabled after init returns.

The init attribute accepts the following optional arguments:

The app attribute will injected a context into this function that comprises the following variables:

Other properties / constraints:

b. #[idle]

This attribute indicates that the function is to be used as the idle task. There can be at most once instance of the idle attribute inside the app pseudo-module. The signature of the idle function must be fn() -> !.

The idle task is a special task that always runs in the background. The idle task runs at the lowest priority of 0. If the idle task is not defined then the runtime sets the SLEEPONEXIT bit after executing init.

The idle attribute accepts the following optional arguments:

The app attribute will injected a context into this function that comprises the following variables:

Other properties / constraints:

c. #[exception]

This attribute indicates that the function is to be used as an exception handler, a type of hardware task. The signature of exception handlers must be [unsafe] fn().

The name of the function must match one of the Cortex-M exceptions that has configurable priority.

The exception attribute accepts the following optional arguments.

The app attribute will injected a context into this function that comprises the following variables:

Other properties / constraints:

d. #[interrupt]

This attribute indicates that the function is to be used as an interrupt handler, a type of hardware task. The signature of interrupt handlers must be [unsafe] fn().

The name of the function must match one of the device specific interrupts. See your device crate documentation (Interrupt enum) for more details.

The interrupt attribute accepts the following optional arguments.

The app attribute will injected a context into this function that comprises the following variables:

Other properties / constraints:

e. #[task]

This attribute indicates that the function is to be used as a software task. The signature of software tasks must be [unsafe] fn(<inputs>).

The task attribute accepts the following optional arguments.

The app attribute will injected a context into this function that comprises the following variables:

Other properties / constraints:

3. extern block

This extern block contains a list of interrupts which are not used by the application as hardware tasks. These interrupts will be used to dispatch software tasks. Each interrupt will be used to dispatch multiple software tasks at the same priority level.

This extern block must only contain functions with signature fn (). The names of these functions must match the names of the target device interrupts.

Importantly, attributes can be applied to the functions inside this block. These attributes will be forwarded to the interrupt handlers generated by the app attribute.