aboutsummaryrefslogtreecommitdiff
path: root/examples/zero-tasks.rs
blob: 132016773a761356b68b150f638055a291515352 (plain) (blame)
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
48
49
//! Minimal example with zero tasks

#![deny(unsafe_code)]
#![feature(proc_macro)] // IMPORTANT always include this feature gate
#![no_std]

extern crate cortex_m_rtfm as rtfm; // IMPORTANT always do this rename
extern crate stm32f103xx; // the device crate

// import the procedural macro
use rtfm::app;

// This macro call indicates that this is a RTFM application
//
// This macro will expand to a `main` function so you don't need to supply
// `main` yourself.
app! {
    // this is a path to the device crate
    device: stm32f103xx,
}

// The initialization phase.
//
// This runs first and within a *global* critical section. Nothing can preempt
// this function.
fn init(p: init::Peripherals) {
    // This function has access to all the peripherals of the device
    p.GPIOA;
    p.RCC;
    // ..

    // You'll hit this breakpoint first
    rtfm::bkpt();
}

// The idle loop.
//
// This runs afterwards and has a priority of 0. All tasks can preempt this
// function. This function can never return so it must contain some sort of
// endless loop.
fn idle() -> ! {
    // And then this breakpoint
    rtfm::bkpt();

    loop {
        // This puts the processor to sleep until there's a task to service
        rtfm::wfi();
    }
}