//! 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(); } }