Attribute Macro cortex_m_rt_macros::entry

source ·
#[entry]
Expand description

Attribute to declare the entry point of the program

IMPORTANT: This attribute must appear exactly once in the dependency graph. Also, if you are using Rust 1.30 the attribute must be used on a reachable item (i.e. there must be no private modules between the item and the root of the crate); if the item is in the root of the crate you’ll be fine. This reachability restriction doesn’t apply to Rust 1.31 and newer releases.

The specified function will be called by the reset handler after RAM has been initialized. In the case of the thumbv7em-none-eabihf target the FPU will also be enabled before the function is called.

The type of the specified function must be [unsafe] fn() -> ! (never ending function)

Properties

The entry point will be called by the reset handler. The program can’t reference to the entry point, much less invoke it.

static mut variables declared within the entry point are safe to access. The compiler can’t prove this is safe so the attribute will help by making a transformation to the source code: for this reason a variable like static mut FOO: u32 will become let FOO: &'static mut u32;. Note that &'static mut references have move semantics.

Examples

  • Simple entry point
#[entry]
fn main() -> ! {
    loop {
        /* .. */
    }
}
  • static mut variables local to the entry point are safe to modify.
#[entry]
fn main() -> ! {
    static mut FOO: u32 = 0;

    let foo: &'static mut u32 = FOO;
    assert_eq!(*foo, 0);
    *foo = 1;
    assert_eq!(*foo, 1);

    loop {
        /* .. */
    }
}